我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/