遇到rsync问题。我正在使用rsync作为一个美化的cp命令。我在脚本中有以下代码。
rsync -aL --exclude /path/to/exclude/ --exclude='.*' /source/ /destination
我可以让rsync排除任何隐藏文件。因此'.*'
我无法排除排除目录。我尝试使用'='
符号,用双引号围绕dir,带单引号。任何帮助将不胜感激。提前谢谢。
答案 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
作为/
的点锚定的)。
如果您要排除特定路径,则仍需要锚定初始斜杠。这可能看起来像是一个小细节,因此您的排除模式会变得更具体(例如Pictures
与home/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)"