我一直没能找到这个问题的答案。我尝试过--include
、--exclude
、-r
、--delete-excluded
和源目录的各种组合。
这就是我想要实现的目标:
源码目录:
Dir1/File1-1 Dir1/File1-2 Dir2/File2-1 Dir2/File2-2 Dir2/File2-3 Dir3/File3-1 Dir3/File3-2 Dir3/File3-3 ...
目标目录:(
状态未知)
我想做的是提供源目录中预定义的文件子集和相对路径,并将它们同步到远程目标,删除目标上不属于文件子集的任何内容(包括目录) 。
例如,给定上面的源目录:
我的预定义文件列表:
Dir1/File1-2 Dir3/File3-3
目标目录:
Dir1/File1-1 Dir1/File1-2 Dir2/File2-1 Dir3/File3-1
完成后,我希望目标中只有 Dir1/File1-2、Dir3/File3-3,而没有 Dir2。我也不希望 Dir1/File1-2 被再次复制。
注意事项:
- 这些是非常大的文件,我试图防止在不需要时再次远程复制它们。
- 源子目录的内容每天都在变化
- 预定义列表每天都会变化,但可能会/将包括昨天列表中的文件
- 源目录中有 0 个文件。它仅包含包含同步所需文件的子目录
- 源代码中的子目录是相当静态的。即 Dir1、Dir2 和 Dir3 将始终存在
我将继续努力,看看是否能找到我正在寻找的解决方案。
更新:
首先我要感谢jw013用于格式更改。我遵循了帮助指南,但不明白为什么格式不正确(第一次海报)。
使用来自的建议哔叽,我想出了以下命令,但它仍然没有从目标中删除不在文件列表中的无关文件。
命令
rsync -avRP --prune-empty-dirs --delete-delay --ignore-existing $FILE_LIST destination/
答案1
您可以使用以下方法执行此操作
rsync -av --delete --update --include-from=LISTFILE -f 'hide,! */' src/ dst
其中LISTFILE
是包含应同步到目标目录的所有文件的文件。如果您的文件没有更改,您可以--ignore-existing
使用--update
.阅读rsync 手册页了解详情。
答案2
如果源中不存在文件,您可以与 rsync 一起使用许多删除选项来删除目标上的文件:
--del an alias for --delete-during
--delete delete extraneous files from dest dirs
--delete-before receiver deletes before xfer, not during
--delete-during receiver deletes during the transfer
--delete-delay find deletions during, delete after
--delete-after receiver deletes after transfer, not during
此外,您可以使用--ignore-existing
跳过复制目标中存在的文件:
--ignore-existing skip updating files that exist on receiver
要删除空目录,您应该使用:
-m, --prune-empty-dirs prune empty directory chains from file-list
所以,命令
rsync -av --prune-empty-dirs --delete-delay --ignore-existing src/ dst
我想会做你正在寻找的事情
答案3
我认为你需要关注--delete-excluded
。我在本地尝试过,似乎可以按要求工作。我会先尝试
rsync -a --delete-excluded --include-from=LISTFILE --exclude="*" src/ dst
我不确定为什么建议某些其他选项:P。最“有趣”的是--ignore-existing
。可能值得确保您首先了解更友好的优化 --a
或-u
。
看起来您已经在使用-a
,这意味着-t
,它允许 rsync 默认进行优化。 “Rsync 使用“快速检查”算法(默认情况下)查找需要传输的文件,该算法查找大小或上次修改时间已更改的文件”。如果您不使用-a
,通常可以使用“-u
或--update
- 跳过接收器上较新的文件”。
如果您想通过“快速检查”优化来衡量差异残疾人, 您可以使用--checksum
。 (如果您想在损坏的情况下在某个时刻强制重新同步所有现有文件,它也很有用。启用-v
后您将能够看到哪些文件必须重写)。