我使用 rsync 从服务器上获取文件,然后在本地获取文件后从服务器上删除它们。我运行的完整命令如下。
这确实成功删除了文件在源服务器上,但空目录仍然存在。我没有收到任何消息或错误。所有输出都正常。也许这是预期的功能。
我怎样才能告诉 rsync 清理所有内容,包括目录?
rsync --progress -vrzh --remove-source-files
两端的版本都是3.0.9。
答案1
您观察到的行为--remove-source-files
正是man rsync
:
--删除源文件
This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.
没有特定的命令来删除目录,因为这两个讨论StackExchange和服务器故障清楚地显示。建议的解决方案是发出两个单独的命令:
rsync -av --ignore-existing --remove-source-files source/ destination/ && \
rsync -av --delete `mktemp -d`/ source/
这两篇文章中建议的最后一条命令是,
rmdir source/
删除(现已清空的)源目录所需的命令在这些帖子中具有这种形式,因为 OP 和答案都使用 rsync 在同一台机器内移动大量文件。对于你的情况,你必须手动执行此操作。
答案2
手册页提到它只删除非目录:
--remove-source-files sender removes synchronized files (non-dirs)
这是预期的行为。
如果您想删除源中的空目录,如果仍然有文件剩余,请执行以下操作:
find . -type d -empty -delete
这将递归,因为它使用的是find
,并且仅适用于空目录(通过选项-empty
)。-delete
删除这些目录。(您不能通过这种方式删除非空目录。)
如果它只是一个空的源目录,那么rmdir <directory>
当然就足够了。
答案3
使用 ”射频“具有固有的竞争条件,你可以删除在同步和R M调用。
我更喜欢使用:
rsync --remove-source-files -a 服务器:incoming/incoming/ &&
ssh 服务器 find 传入 -type d -delete
如果目录不是空的,则不会删除目录。
答案4
-m, --prune-empty-dirs
从文件列表中修剪空目录链
--force
强制删除目录,即使目录不为空