我有 2 个目录:src 和 dst。src 仅包含 1 个文件“index.php”。dst 包含“index.php”和“readme.txt”。我还有一个 list.txt 文件,其中仅包含一行:“index.php”。
现在,在包含 src 和 dst 的目录中,我执行以下命令:
rsync -av --include-from=list.txt src/ dst/ --del
如果需要,它会更新“index.php”文件,但它也会删除 readme.txt。
如果它不在 list.txt 文件中,为什么要删除它?有什么简单的方法可以“修复”此行为吗?
我基本上想要让 rsync 只关注列表中的文件。它们可能需要更新或删除(因此使用 --del 选项),但我不想让它触及其他文件。我不能使用“--files-from”选项,因为它不会删除目标中的文件。
编辑:“index.php”在这里只是一个例子 - 事实上太简单的例子,因为 src 和 dst 可能包含整个目录树,所以如果 list.txt 有一个像“abc/test.php”这样的条目,它也应该适用于这个文件。
答案1
解决方案是添加--exclude=*
:
rsync --verbose -r --del --include-from=list.txt --exclude=* src/ dst/
仅更新来自的文件,仅当它们不存在时才list.txt
删除dst
src
和包含在内list.txt
。
答案2
这看起来可能有点小题大做,但对我来说却很有效:
rsync -r -av --include-from=list.txt --files-from=list.txt --delete-missing-args src/ dst/
但是,它会根据更新/删除的文件具体更新该文件。
即,如果同名文件位于不同的子目录中,它不会更改或删除,只会根据其在 src/ 父目录中的位置进行更改或删除。