web-dev-qa-db-ja.com

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

最近、私は多数のファイル(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がすべて削除されますが、ディレクトリはそのまま残ります。私は「ラウンドロビン」のようなディレクトリ構造を持っているので、files/directoriesの数は1に非常に近いので、ディレクトリを完全に削除するために最初のコマンドを再度実行する必要があります。

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

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

--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)

moveをrsyncで一気に模倣する方法はありますか?

17
Alix Axel

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

$ 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

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

7
slm

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

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

利点は、zanyが言ったように、正しく理解していない場合や初心者のためにrm -rfを使用することには依然としていくつかの危険が伴うことです。

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

10
mit

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

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

User7000から--deleteおよび--remove-source-filesrsyncへの同じ呼び出しで一緒に。操作が失敗したり中断されたりして同じ呼び出しが繰り返されると、データが失われます。 anyの場合は、--dry-runオプションを使用して、何が行われるかを確認します。

2
gjvc