事情是这样的,
我的服务器上有一个 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 选项来传输文件的后半部分……