使用 rsync 删除目标目录(内容以及父目录)

使用 rsync 删除目标目录(内容以及父目录)

versions/在远程服务器上有一个目录,我只能通过 rsync 守护进程和 ftp 访问该目录。该目录包含一组子目录,每个子目录均以已部署代码库的日期时间命名(例如,versions/20150101000000/versions/20150102120000/等)。我需要自动删除旧版本,我的直觉是,具有空源目录的 rsync 比使用 ftp 递归迭代要快得多(我已经验证我没有 ftp 的 SITE EXEC 可用于执行简单的操作rm -rf versions/$version/)。

我使用初始rsync --list-only命令来解析版本列表,对它们进行排序(我已经看到证据表明 rsync 并不总是按预期顺序返回列表),然后选择删除除最新 3 个版本之外的所有版本。

清空特定目录的命令很简单:

rsync -vr --delete `mktemp -d`/ rsync://user@host:123/module/versions/$version/

但是,按照预期的 rsync 方式,这不会删除顶级目录本身。 rsync 有没有办法请求删除正在同步的目录及其内容?否则,我怀疑应该可以使用//参数versions/的某些组合对父目录运行同步,但我一生都无法弄清楚。--exclude--include--filter

我尝试过类似的事情:

rsync -vr --delete --include=/20150101000000/ rsync://user@host:123/module/versions/

带或不带斜杠,带或不带在参数--exclude='*'之前或之后列出--include,以及--delete-excluded在匹配--include--exclude参数需要它的情况下使用。似乎没有什么能够达到我想要的结果。

我本可以通过执行 rsync 来清空内容,然后rmdir在空目录上使用 ftp 来完成任务,但我很顽固地知道仅使用 rsync 就可以做到这一点,因此希望找到解决方案。谢谢!

答案1

固执是好的。当以下工作有效时,我停止了,用本地文件进行了测试,而不是rsync://。使用 -n 不执行此操作,使用 -iv 看看为什么执行此操作。 empty是你本地的空目录。要删除的远程目录 20150101000000 也必须为空。

rsync -nivd --delete --filter='-! /20150101000000' empty/ rsync://user@host:123/module/versions/

答案2

感谢一位友好的 IRC 联系人,我找到了一个可行的解决方案,可以使用单个rsync命令删除特定目录。它的工作原理是--include为目录内容指定一个参数 ( --include '/20150101000000/**'),--include为目录本身指定一个单独的参数 ( --include '/20150101000000/'),并--exclude '*'忽略顶级目录的所有其他内容(在本例中为versions/):

rsync -vr --delete --include '/20150101000000/**' --include '/20150101000000/' --exclude '*' `mktemp -d`/ rsync://user@host:123/module/versions/

然后,我深入研究了手册页,试图完全理解上述内容,并发现了这个方便的部分:

尾随的“dir_name/***”将匹配目录(就像已指定“dir_name/”)和目录中的所有内容(就像已指定“dir_name/**”)。此行为是在版本 2.6.7 中添加的。

这些信息使我们能够简化为一个--include参数:

rsync -vr --delete --include '/20150101000000/***' --exclude '*' `mktemp -d`/ rsync://user@host:123/module/versions/

相关内容