使用 rsync 删除重复文件

使用 rsync 删除重复文件

事情是这样的,

我的服务器上有一个 50 GB 大小的文件夹,其中包含超过 60000 个文件。我使用 rsync 将其传输到镜像服务器,几乎一半的文件已传输完毕。现在我想在主服务器上删除已传输的文件。

可以用 rsync 完成吗?我确实阅读了帮助并找到了 --delete 选项,但这些文件非常重要,所以我想听听专家的意见,谢谢。

答案1

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"

答案2

如前所述,rsync 不会从源删除,只会在目标上删除。

对于您来说,我会生成镜像服务器上文件的 MD5 哈希值,然后在主服务器上检查哈希值是否正确并删除这些文件。

IE:

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

..将 mirror.md5 传输到主服务器...

primary$ md5sum -c mirror.md5

检查是否有任何失败的文件,然后删除已成功传输的文件。您可以像这样自动执行此操作:

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

这将过滤所有具有良好哈希值的文件,从 md5sum 中切掉“OK”部分并逐个删除文件。

不用说,在这之后你想要使用 rsync 的 --delete 选项来传输文件的后半部分……

相关内容