rsync 具有模式匹配的特定子目录

rsync 具有模式匹配的特定子目录

我正在尝试使用 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/一个目录cccbbb绑定到源代码树的顶部

包含和排除操作从左到右处理(第一个操作比第二个更重要,第二个比第三个更重要)。

现在让我们看看您的具体示例:

rsync -ah --include="data/foo*" --exclude="*.zip" --exclude="*" "/path/to/data" "/mnt/backup/drive"

过滤规则按顺序表示:

  1. foo包括名为 的目录中名称以 开头的所有文件或目录data 源路径下方的某处
  2. 排除所有*.zip文件(或目录)。
  3. 排除我们尚未提及的所有内容。

第一个包含会匹配/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/先包含。如果不包含超级目录,则即使包含子目录也会被忽略。

匹配模式是从左到右进行的。

相关内容