我想从 rsync 中排除 /bar/,但仅限于文件夹 /foo/ 中。
如果我使用 --exclude '/foo/bar/' ,它只会在 foos 父目录上运行时 rsync 才会起作用,但在我们的设置中,我无法这样做。
如果我使用 --exclude '/bar/',它将排除所有 /bar/ 子目录,例如包括 /fee/bar/。
我要做的只是在目标目录为 /foo/ 时排除 /bar/
这在 rsync 中可以实现吗?
或者我是否需要有一些包装脚本来插入排除规则,其目标是/foo/?
答案1
从rsync(1)
手册页“INCLUDE/EXCLUDE PATTERN RULES”中:
o if the pattern starts with a / then it is anchored to a particu- lar spot in the hierarchy of files, otherwise it is matched against the end of the pathname. This is similar to a leading ^ in regular expressions. Thus "/foo" would match a name of "foo" at either the "root of the transfer" (for a global rule) or in the merge-file’s directory (for a per-directory rule).
答案2
请参阅以下代码片段,foo/bad 和 bar/bad 被创建为包含某些文件的目录,如果您简单地使用“*foo/bad”排除它们,那么 foo/bad 中包含的每个“bad”(文件或目录)都将被忽略。
e@lap:/tmp$ mkdir -p source/foo/bad source/bar/bad target
e@lap:/tmp$ touch source/foo/bad/a.txt source/bar/bad/a.txt
e@lap:/tmp$ rsync -vr --exclude "*/foo/bad" source target/
sending incremental file list
source/
source/bar/
source/bar/bad/
source/bar/bad/a.txt
source/foo/
sent 153 bytes received 47 bytes 400.00 bytes/sec
total size is 0 speedup is 0.00