![rsync无法删除非空目录](https://linux22.com/image/1348972/rsync%E6%97%A0%E6%B3%95%E5%88%A0%E9%99%A4%E9%9D%9E%E7%A9%BA%E7%9B%AE%E5%BD%95.png)
当同步我的远程备份时出现错误rsync cannot delete non-empty directory
。
我知道原因:我排除了一些文件,当 rsync 尝试删除远程目录(因为它在本地不存在)时,由于它不是空的,所以它无法删除。如果不排除,目录将被清空。
我也知道我可以通过使用--delete-excluded来解决这个问题,但这不是我想要的。
我想跳过上传某些文件(因为它们对于我的上传速度来说太大),但我想保留那些我之前已经上传的文件如果它们在本地存在。如果它们在本地不存在,则应将其删除。--delete-excluded 将在远程端删除它们。
这也意味着如果目录在本地不再存在,那么即使它包含排除的文件也应该被删除。
是否可以设置 rsync 来实现这一点?
答案1
使用p
修饰符:
p 表示规则是易失效的,这意味着在要删除的目录中会忽略该规则。例如,-C 选项的默认规则(排除“CVS”和“*.o”等内容)被标记为易失效,并且不会阻止在源上已删除的目录在目标上被删除。
例如,我使用以下-F
选项:“告诉 rsync 查找已在层次结构中散布的每个目录 .rsync-filter 文件,并使用其规则来过滤传输中的文件。”
我.rsync-filter
包含如下行来过滤掉 Mac 留下的“垃圾”:
-p .DS_Store
-p ._*
如果使用exclude
而不是-
,请添加逗号。例如:
exclude,p .DS_Store
exclude,p Thumbs.db
答案2
您可以使用包含/排除模式的修饰符,在您使用的模式上添加 -s。它告诉 rsync 排除规则仅适用于发送端。
-n :仅检查将按 desc 删除的内容,不删除模式:*.sh desc:/home/kg/tmp
目的:想要删除 desc 上 .sh 结尾的文件,但是如果你这样做,则无法在 desc 上删除:rsync -rvz --exclude *.sh --delete -n conkg[电子邮件保护]:/家/公斤/ tmp
应改为:请在测试时添加-n:rsync -rvz --exclude-from del.txt -n --delete conkg[电子邮件保护]:/home/kg/tmp 真正删除:rsync -rvz --exclude-from del.txt --delete conkg[电子邮件保护]:/home/kg/tmp cat del.txt-s*.sh
或者:rsync -rvz --exclude -s*.sh --delete conkg[电子邮件保护]:/家/公斤/ tmp
答案3
您可以使用此选项强制删除:
--force force deletion of directories even if not empty
答案4
只需使用 rsync 的 '--max-size=xx' 和 '--delete' 选项。它将自动完成所有操作并满足您的所有要求。