web-dev-qa-db-ja.com

rsyncで重複ファイルを削除する

これが事です、

サーバー上に50GBのサイズのフォルダーがあり、そのフォルダーには60000を超えるファイルが含まれています。 rsyncを使用してミラーサーバーに転送しましたが、ファイルのほぼ半分が転送されました。メインサーバーで転送されたファイルを削除したいと思います。

これはrsyncで実行できますか?ヘルプを読んで--deleteオプションを見つけましたが、これらのファイルは非常に重要なので、専門家の意見に感謝したいと思います。

5
codedme

rsync(バージョン3.0.9でチェック済み)には、--remove-source-filesというオプションがあります。転送されたファイルのみを削除し、まだ転送されていない追加のファイルを転送したくない場合は、オプション `--existing``を追加で使用する必要があります。

残念ながら、オプション--verbose --itemize-changes --statsが使用されていても、rsyncは削除するファイルを出力しないようです。

# create source and target dirs
mkdir /tmp/source
mkdir /tmp/target
# create a test file in source
touch /tmp/source/test
# rsync source and target
rsync --archive --itemize-changes --verbose --stats /tmp/source/ /tmp/target
# verify that test has been copied to target
[ -f /tmp/target/test ] && echo "Found" || echo "Not found"
# create another file in source
touch /tmp/source/test2
# delete files on source which are already existing on target
rsync --archive --itemize-changes --verbose --stats --remove-source-files --existing /tmp/source/ /tmp/target
# verify that test has been deleted on source
[ -f /tmp/source/test ] && echo "Found" || echo "Not found"
# verify that test2 still exists on source and was not transferred to target
[ -f /tmp/source/test2 ] && echo "Found" || echo "Not found"
[ -f /tmp/target/test2 ] && echo "Found" || echo "Not found"
5

前に書いたように、rsyncはソースから削除せず、宛先でのみ削除します。

あなたの場合、ミラーサーバー上のファイルのMD5ハッシュを生成してから、プライマリサーバーでハッシュが正しいかどうかを確認し、それらのファイルを削除します。

つまり:

mirror$ find . -type f -print0 | xargs -0 md5sum > mirror.md5

..mirror.md5をプライマリサーバーに転送します。

primary$ md5sum -c mirror.md5

FAILEDファイルがないか確認してから、正常に転送されたファイルを削除します。次のように自動化できます。

md5sum -c mirror.md5 | grep 'OK$' | sed -e 's/: OK$//' | while read FILE; do rm "$FILE"; done

これにより、すべてのファイルが適切なハッシュでフィルタリングされ、md5sumから「OK」の部分が切り取られ、ファイルが1つずつ削除されます。

言うまでもなく、この後、あなたはしないでください rsyncから--deleteオプションを使用してファイルの後半を転送したいと思います...

1
JvO