最近、私は多数のファイル(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で一気に模倣する方法はありますか?
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
理想的ではありませんが、仕事をします。
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番目のコマンドを他の状況に移植しやすくし、さらに安全にします(一部のディレクトリが空ではなく、ディレクトリツリーの最も深いところから削除を開始します)
これは、1つのステップでジョブを実行します。ソースパスとターゲットパスの両方の末尾のスラッシュに注意してください。
rsync \
-ruval \
--ignore-existing \
--remove-source-files \
--Prune-empty-dirs \
/source/path/ /target/path/
User7000から--delete
および--remove-source-files
rsync
への同じ呼び出しで一緒に。操作が失敗したり中断されたりして同じ呼び出しが繰り返されると、データが失われます。 anyの場合は、--dry-run
オプションを使用して、何が行われるかを確認します。