无法获取rsync排除选项以排除dir

时间:2011-03-17 18:29:37

标签: linux batch-file unix scripting rsync

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

  

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

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

5 个答案:

答案 0 :(得分:15)

实际上,这些都不完全准确。

Erik说得那么正确

  

由于test / a是同步的基本目录,因此以/

开头指定排除模式

排除模式的 root 确实是test/a(即模式/some/path绑定到test/a/some/path),但这不是整个故事。< / p>

从手册页:

  

如果模式以/开头,则它将锚定到文件层次结构中的特定位置,否则将与路径名的末尾匹配。这类似于正则表达式中的前导^。因此,“/ 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将排除 test/a/b/c/d(和子女)(test/a作为/的点锚定的)。

如果您要排除特定路径,则仍需要锚定初始斜杠。这可能看起来像是一个小细节,因此您的排除模式会变得更具体(例如Pictureshome/daniel/Pictures),但它可能会让您陷入困境。

答案 1 :(得分:9)

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打印的格式匹配。

答案 2 :(得分:3)

按照Erik的例子,你想要这样做:

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

答案 3 :(得分:1)

其中任何一种都可以工作:

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是正确的:排除路径中的此初始/可能希望排除特定路径,并且应将此初始/理解为正则表达式中的^开头。但是,他的答案对源路径中结尾/的输入有严格的要求。

答案 4 :(得分:0)

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

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