我正在尝试使用 rsync 复制一组特定的子目录来备份它们。我的目录结构看起来像这样:
/path/to/data/foo1
/path/to/data/foo2
/path/to/data/bar1
/path/to/data/bar2
我只想复制“foo”文件夹,忽略“bar”文件夹。
我还想忽略这些文件夹中的任何 .zip 文件。
我在 rsync 中尝试了多种参数组合,但无法让它完全按照我想要的方式进行。
我可以使用两个命令来进行传输:
rsync --dry-run -a --human-readable --stats --progress --exclude"*.zip" "/path/to/data/foo1" "/mnt/backup/drive/"
rsync --dry-run -a --human-readable --stats --progress --exclude"*.zip" "/path/to/data/foo2" "/mnt/backup/drive"
在其他地方阅读,我希望这样的事情能够发挥作用
rsync --dry-run -a --human-readable --stats --progress --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"
但这似乎也捕获了“bar”文件夹。
--include 和 --exclude 参数的顺序让我感到困惑。由于需要在 --include 参数中指定“数据”文件夹,这不是我期望的功能。
我缺少的明显标志是什么!
感谢您的输入。
本
答案1
您可以通过以下方式运行 rsync:
rsync --dry-run -av --human-readable --stats --progress --exclude="*.zip" /path/to/data/foo* /path/to/copy/to/
也许您想以这种方式缩短命令:
rsync -avhn --stats --progress --exclude="*.zip" /path/to/data/foo* /path/to/copy/to/
引用自人同步
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
-h, --human-readable output numbers in a human-readable format
-n, --dry-run perform a trial run with no changes made
当你准备好运行命令时,无需-n
还可以使用此参数保存日志文件:
--log-file=
所以上面的 rsync 命令将变为:
rsync -avhn --stats --progress --exclude="*.zip" --log-file=logfile.log /path/to/data/foo* /path/to/copy/to/
日志文件将写入运行命令的同一目录中,如果需要将其保存在其他位置,则必须使用绝对路径。例如:
--log-file=/path/to/logfile
答案2
你已经有了合适的答案,那就好了。我想解决您问题的另一部分,即为什么该--include
功能没有达到您的预期。
首先,让我们看看--include
和--exclude
过滤器是如何运行的。
aaa
将适用于任何名为aaa
/aaa
将应用于aaa
源路径顶部命名的任何文件或目录aaa/
将适用于任何名为aaa
您可以将它们组合起来,因此 的路径bbb/ccc/
表示ccc
作为目录子级的任何目录bbb
源代码树中的任何位置,但是是目录中的/bbb/ccc/
一个目录ccc
bbb
绑定到源代码树的顶部。
包含和排除操作从左到右处理(第一个操作比第二个更重要,第二个比第三个更重要)。
现在让我们看看您的具体示例:
rsync -ah --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"
过滤规则按顺序表示:
foo
包括名为 的目录中名称以 开头的所有文件或目录data
源路径下方的某处。- 排除所有
*.zip
文件(或目录)。 - 排除我们尚未提及的所有内容。
第一个包含会匹配/path/to/data/data/foo1
,但不会匹配/path/to/data/foo1
。我怀疑这是主要的误解。
您可以将您的/foo*
目录与非常相似的解决方案相匹配:
rsync -ah --include="/foo*/" --exclude="*.zip" --exclude="*" "/path/to/data/" "/mnt/backup/drive"
但实际上,如果我写这篇文章,我可能会/foo*
在源路径规范中包含目录(请注意,foo*
未加引号,因此 shell 可以获取通配符),并且只担心排除不需要的 zip 文件:
rsync -ah --exclude="*.zip" /path/to/data/foo*/ /mnt/backup/drive
答案3
*
在排除与排除的情况下*/
,如果要包含data/foo
,必须data/
先包含。如果不包含超级目录,则即使包含子目录也会被忽略。
匹配模式是从左到右进行的。