【问题标题】:Cannot get rsync exclude option to exclude dir无法获取 rsync 排除选项以排除目录
【发布时间】:2011-07-17 15:29:14
【问题描述】:

rsync 有问题。我使用 rsync 作为美化的 cp 命令。我在脚本中有以下代码。

rsync -aL --exclude /path/to/exclude/ --exclude='.*' /source/ /destination

我可以让 rsync 排除任何隐藏文件。因此 '.*' 我无法排除要排除的目录。我尝试使用'=' 符号,用双引号将目录括起来,用单引号。任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 为了清楚起见,我试过--exclude=/path/to/exclude/--exclude /path/to/exclude/--exclude '/path/to/exclude/'--exclude "/path/to/exclude/"--exclude="/path/to/exclude/"--exclude='/path/to/exclude/'
  • 尝试 --exclude '/path/to/exclude' 不带尾随 /,在某些情况下 rsync 有一些行为。否则你也可以试试--exclude '/path/to/exclude/*'
  • 谢谢 Aif,我已经试过不带尾随 /。我忘了把它添加到我的列表中。很奇怪,我一定是错过了什么。
  • 我认为这是因为排除是一个相对路径,并且执行/path/to/exclude 实际上并不认为/ 作为文件系统的根。这可以解释为什么@Erik 的帖子有效。
  • @Aif:是的。如果排除模式包含 / 或 **,则匹配整个路径,否则匹配文件名

标签: linux unix scripting rsync


【解决方案1】:

实际上,Erik's 和 Antoni's 的答案都不是完全准确的。

Erik 说对了一半

由于 test/a 是从中同步的基本目录,因此排除模式以 a/ 开头指定

排除模式的根确实是test/a(即模式/some/path绑定到test/a/some/path),但这还不是全部。

来自手册页:

如果模式以 / 开头,则它被锚定到文件层次结构中的特定位置,否则它与路径名的末尾匹配。这类似于正则表达式中的前导 ^。因此“/foo”将匹配一个名为“foo”的文件 “传输的根”(对于全局规则)或在合并文件的目录中(对于每个目录规则)。

我们可以忽略per-directory 位,因为它不适用于我们这里。

因此,rsync -nvraL test/a test/dest --exclude=a/b/c/d 肯定会排除 test/a/b/c/d(和孩子),但也会排除 test/a/other/place/a/b/c/d。

另一方面,

rsync -nvraL test/a test/dest --exclude=/b/c/d 将排除only test/a/b/c/d(和孩子)(test/a 是/ 的锚点)。

如果您想从备份中排除特定路径,您仍然需要锚定初始斜线。这可能看起来像一个小细节,而且您的排除模式变得越具体(例如Pictures 与home/daniel/Pictures),但它可能只会咬你一口。

【讨论】:

  • 关于源路径中结尾 / 的严重错字。见my answer。
【解决方案2】:

其中任何一个都可以:

rsync -nvraL test/a test/dest --exclude=/a/b/c/d
rsync -nvraL test/a/ test/dest --exclude=/b/c/d

请注意,源路径中的结尾 / 对如何指定 --exclude 有重要影响。这假设我们有:

mkdir -p test/a/b/c/d/e
mkdir -p test/a/other/place/a/b/c/d
mkdir -p test/dest

当排除路径以/ 开头时,原始帖子有困难。 Daniel’s answer 是正确的,排除路径中的此初始 / 可能需要排除特定路径,并且此初始 / 应理解为正则表达式中的前导 ^。但是,他的回答对源路径中的结尾 / 有一个严重的拼写错误。

【讨论】:

  • 你知道斜杠的关键区别是什么吗?或者只是它停止按预期工作?
【解决方案3】:

如果要指定绝对路径,可以使用realpath 将它们转换为相对路径:

--exclude="$(realpath --relative-to=$PWD /home/file)"

【讨论】:

    【解决方案4】:

    按照 Erik 的示例,您想这样做:

    rsync -nvraL test/a/ test/dest --exclude=/b/c/d
    

    【讨论】:

      【解决方案5】:
      mkdir -p test/a/b/c/d/e
      mkdir -p test/dest
      rsync -nvraL test/a test/dest --exclude=a/b/c/d 
      

      这行得通。由于test/a 是同步的基本目录,排除模式以a/ 开头指定

      如果这没有帮助,请告诉我们真正的路径/排除。

      使用 -vn 运行 rsync 将列出目录/文件 - 模式与 rsync 打印的格式相匹配。

      【讨论】:

      • 感谢 Erik 的回复。你是靠钱的。奇怪的是 exclude 选项不采用绝对路径。
      • @James P. rsync 过滤器并不是很直观......但是,它们确实有效,您只需多次阅读手册页中的“FILTER RULES” :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 2010-09-26
      相关资源
      最近更新 更多