最近、私は大量のファイル(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
ディレクトリはそのまま残ります。数値が1に非常に近い「ループ」に似たディレクトリ構造があるため、ディレクトリをfiles/directories
完全に削除するには、最初のコマンドを再実行する必要があります。
rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
校正はmv
ほぼすぐに完了しますが、私の~/destination
ディレクトリに保存する必要があるファイルがあるため、これはmv
オプションではありません。--prune-empty-dirs
とrsyncオプションが見つかり--force
ましたが、どちらも期待どおりに機能しないようです。
--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をワンタイムで使用しますか?
答え1
zanyのコメントからslmの回答まで(rsyncを使用してファイルを移動し、ディレクトリを削除しますか?)答えとして、次の2つのコマンドをお勧めします。
rsync -av --ignore-existing --remove-source-files source/ destination/ && \
find source/ -depth -type d -empty -exec rmdir "{}" \;
利点は、Zanyが言ったように、rm -rfが正しく使用されていないか、初心者が使用している場合でもまだ危険です。
-lengthと-emptyという2つのオプションを追加しました。これが実際に必要かどうかはわかりませんが、2番目のコマンドをより移植可能にし、他の場合でもより安全にします(一部のディレクトリが空ではなく、まだ正しい操作を実行している場合)。 )ディレクトリツリーの最も深いところから削除を開始します)
答え2
stackoverflowで次のタイトルの投稿を見つけました。rsync "移動"を使用してフォルダを削除しますか?、これは本質的に同じ質問をすることです。答えの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
理想的ではありませんが、作業を完了します。