質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.96%

ディレクトリ構成を維持しつつコピーし、コピー終了後、コピー元を削除するには

解決済

回答 7

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,615

score 11

現在、CentOS上にてファイルのバックアップ処理を構築しております。

bashにて組んでおりますが、

その中で、

ディレクトリ構成を維持しつつコピーし、
コピー終了後、コピー元を削除する

必要が出てきました。

出来れば、コマンド発行1回で出来れば良いなと考えているのですが、
そのような事は可能でしょうか?

「rsync」や「cp」では、ディレクトリ構成を維持したままファイルをコピーは出来ると思うのですが、コピー元のファイルは残ってしまうと思いますが、コピー元を削除するような方法が御座いますでしょうか?

よろしくお願い致します。

申し訳御座いません。
以下、追記致します。

ディレクトリ内には、バックアップ対象ファイルと非バックアップ対象ファイルが混在しておりますので、ディレクトリ毎 mv は出来ないのではないかと思っております。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • otn

    2016/09/02 21:28

    移動対象のファイルかどうかはどうやって判断するのですか?

    キャンセル

  • YuuichiroEndo

    2016/09/02 22:04 編集

    ファイルの更新日付を取得し、現在日時より30日より前に作成されたファイルを移動対象としています。

    キャンセル

回答 7

+4

「cp」では、ディレクトリ構成を維持したままファイルをコピーは出来ると思うのですが、コピー元のファイルは残ってしまうと思いますが、コピー元を削除するような方法が御座いますでしょうか? 

mv でいいんじゃないですかね…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+2

mvコマンドを使いましょう。

同じファイルシステム上であればディレクトリエントリの更新でアトミックに処理されるため、問題も発生しません。

異なるファイルシステムにmvする場合は内部的に複製が発生するので、別途考慮が必要です。
ファイルシステムが異なる場合、mvコマンドを使えばコピーが完了したものから順次削除されます。
標準コマンドはエラー処理なども作りこまれているため、こちらを利用するのをおすすめします。

問題が発生するケースとしては、シンボリックリンクだけ先に移動した後に、実体コピー中に容量不足等で移動に失敗した場合です。
この場合はデッドリンクとなります。

--
以下追記(修正)

バックアップ対象がsrc/aaa/a.txtsrc/aaa/b.txtsrc/bbb/c.txtとして、移動元を消す場合は以下のコマンドで一発で出来ます。

 listの内容

src/aaa/a.txt
src/aaa/b.txt
src/aaa/c.txt

 バックアップして削除

(tar cpf - -T list | tar xpf - -C dst); xargs rm < list

dstはバックアップ先フォルダです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/02 17:19 編集

    ご回答ありがとうございます。
    ちなみに、上記のコマンドだとコピー先でディレクトリ構成は維持されておりますでしょうか?

    コピー先で
    ーーーーーーーーーーー
    dst
      aaa
        a.txt
        b.txt
      bbb
        c.txt
    ーーーーーーーーーーー
    となるようなイメージです。

    キャンセル

  • 2016/09/02 17:23

    うっかりしてました。ディレクトリ構造保てないですね。
    1ライナーでやるのは難しいので、スクリプトを書いてそれを呼び出すのはいかがでしょうか。

    キャンセル

  • 2016/09/02 17:40

    先ほどの回答は間違えていたので、1コマンドではないけど、1行で可能な方法について回答に追記修正しておきました。

    キャンセル

+2

mvコマンドでディレクトリを移動させるのはどうでしょうか。
参考

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

moonphaseさんの回答に乗っかりますが…

(cd /hoge;tar cpf - -T list) | (cd /piyo;tar xpf -;xargs rm < list)


こんな感じの使い方もできますので参考までに。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

rsync に --remove-source-files を渡すとコピー元が消えます。
ただしディレクトリは消えません。

# mkdir -p src/a/b src/c/e

# touch src/a/b/x

# touch -t 198001010000 src/c/e/y

# rsync -a --remove-source-files --files-from=<(cd src; find -mtime -30 -type f) src/ dst/

# find
.
./dst
./dst/a
./dst/a/b
./dst/a/b/x
./src
./src/c
./src/c/e
./src/c/e/y
./src/a
./src/a/b

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

コマンド1つだと皆さんの書かれている「mv」になるような気がします。
もしワンライナーで良ければ「&&」や「;」を使うことをおすすめします。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

コマンド一つにしたい?

コマンドを複数かいたshを作成してください。

そしてそれをコールしてください。

以下はシェルファイル

#vi bk.sh
cp copyoption
rm removeoption

呼び出し

sh bk.sh

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る