rsyncでファイルを移動してディレクトリを削除しますか?


17

最近、大量のファイル(100万を超える)を削除する必要がありました。

rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source

それを行うための最も最適化された方法の1つであり、それよりも高速であることを保証できrm -rfます。

私はこの問題の専門家ではありませんが、rsyncのパフォーマンスの理由は、ファイルをリストする方法(FIFOではなくLIFOの場合)に何らかの理由があります。問題は、大量のファイルを効率的な方法で移動する必要があることです。少し検索した後、私はこれを見つけました:

rsync -av --ignore-existing --remove-source-files ~/source ~/destination

これにより、に移動したすべてのファイルが削除されます~/source、ディレクトリはそのまま残ります。「ラウンドロビン」のようなディレクトリ構造を持っているため、の数はfiles/directories1に非常に近いため、ディレクトリを完全に削除するには、最初のコマンドを再度実行する必要があります。

rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source

ストレートmvはほぼ瞬時に終了し~/destinationますが、私のディレクトリには保持する必要があるファイルがあるためmv、オプションではありません。--prune-empty-dirsおよび--forcersyncオプションを見つけましたが、どちらも期待どおりに動作しないようです:

--force                 force deletion of directories even if not empty
--prune-empty-dirs      prune empty directory chains from the file-list
--remove-source-files   sender removes synchronized files (non-dirs)

一度にrsyncで動きを模倣する方法はありますか?


2
ここで回答が得られない場合は、rsyncリストに投稿してみてください。彼らはとても役に立ちます。lists.samba.org/mailman/listinfo/rsync
ジョー

回答:


7

私はこのスレッドをstackoverflowで見つけました:rsync "move"でフォルダを削除しますか?、本質的に同じ質問をしています。答えの1つは、rsyncファイルとソースディレクトリの移動/削除を実行できる単一のコマンドがないように見えるため、in 2コマンドを実行することを提案しました。

$ rsync -av --ignore-existing --remove-source-files source/ destination/ && \
  rsync -av --delete `mktemp -d`/ source/ && rmdir source/

または、次のコマンドを使用して実行できます。

$ rsync -axvvES --remove-source-files source_directory /destination/ && \
  rm -rf source_directory

理想的ではありませんが、仕事をします。


はい、その質問に答えたのは私でした(この質問にも同じ「解決策」があります)。= P
アリックスアクセル

@AlixAxel-ハ、すみません、あなたがその答えに気づかなかった。しかたがない。この回答を削除しますか?
slm

3
rsyncディレクトリを整理するために使用することは正しくないと感じ、常に危険がありrm -rfます。私はあることを第二のステップをお勧めします:find source/ -d -type d -exec rmdir {} \;
おどけた

2
追加するだけで、決して使用-deleteしない--remove-source-filesで、1つのrsyncコマンドで実行する必要があります(上記の例は問題ありませんが、これは正接です)。中断してから、説明した内容を再実行すると、転送されたファイルが失われます。以前にやったこと:(
Sridhar Sarnobat

でクリーンアップするときfind、私はこれを好みます: find source/ -type d -empty -delete それは私にそれがただすべてを破壊するわけではないという安心感の奇妙な感覚を与えます。
-greyfade

10

zanyのコメントからslmの回答(rsyncを使用してファイルを移動し、ディレクトリを削除しますか?)次の2つのコマンドを回答としてお勧めします。

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
find source/ -depth -type d  -empty -exec rmdir "{}" \;

利点は、ザニーが言ったように、あなたがそれを正しくしないか初心者のためにrm -rfを使用することにまだいくらかの危険が伴うことです。

-depthと-emptyの2つのオプションを追加しました。これが本当に必要かどうかはわかりませんが、2番目のコマンドを他の状況でより移植しやすく、さらに安全にします(いくつかのディレクトリが空でない場合でも正しいことを行いますディレクトリツリーの最深点から削除を開始します)


なぜ-delete代わりに-exec rmdir {} \;
空飛ぶ羊

シムの答えでuser7000のコメントを参照してください@flying_sheep:rsyncのISTは、ファイルを失う可能性が中断されたときに
MIT

rsyncが中断されると、検索が開始されないかどうか?したがって、2回目のrsyncでの-deleteは問題になりません。ただし、-deleteはファイルも削除します。代わりに、rmdirはファイルを削除せず、ディレクトリのみを削除します。両方(-deleteとrmdir)は、削除する前にディレクトリが空かどうかを確認します。
ベンバ

さらに、manページは、uが代わりに-exec ...の-execdir使用する必要があると言う
benba

2

これにより、ジョブは1ステップで実行されます。ソースパスとターゲットパスの両方の末尾/スラッシュ/に注意してください。

rsync \
    -ruval \
    --ignore-existing \
    --remove-source-files \
    --prune-empty-dirs \ 
    /source/path/ /target/path/

を使用--deleteしない--remove-source-filesで、同じ呼び出しで一緒にuser7000から警告をエコーしrsyncます。操作が失敗または中断され、同じ呼び出しが繰り返されると、データが失われます。内ならばどんな疑問、使用し--dry-runて行われることになるかを確認するオプションを選択します。


-ruval冗長のようです。-a同等であること-rlptgoDの両方を含む、-rそして-l
greyfade
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.