Answers:
全球rsync
居领先开始过滤规则/
被固定到转移的根源。引用手册页的“包含/排除模式规则”部分:
如果模式以/开头,则它将锚定到文件层次结构中的特定位置,否则将与路径名的末尾匹配。这类似于正则表达式中的前导^。因此,“ / foo”将在“传输的根目录”(对于全局规则)或在合并文件的目录(对于每个目录规则)中匹配名称“ foo”。
在您的命令(rsync ... -arv /home/ben home-ben/
)中,文件/home/ben/foo
将传输到home-ben/ben/foo
。传输的根是home-ben
,正确的过滤器路径是/ben/foo
。从而,
/home/ben/.ccache
您需要的过滤器路径/ben/.ccache
/home/ben/build/
您需要的过滤器路径/ben/build/
可以在rsync(1)
手册页的“锚定包含/排除模式”部分中找到更详细的说明。
请注意,仅仅忽略领导/
者并不一定是您想要的。从同一手册页部分再次引用:
不合格的“ foo”将在树中的任何位置匹配名称“ foo”,因为该算法是从上到下递归应用的;它的行为就像每个路径组成部分在文件名的末尾转过头一样。即使未锚定的“ sub / foo”也将在层次结构中在名为“ sub”的目录中找到“ foo”的任何点匹配。有关如何指定与传输根源匹配的模式的完整讨论,请参见“锚定包含/排除模式”部分。
因此,的过滤器模式build/
将匹配/home/ben
甚至在中任何位置的构建目录/home/ben/many/sub/directories/build/
。
rsync -a source destination
将源目录本身复制到目标。这确定了传输的根源,以便通知排除表达式。上面解释了排除表达式中/的正确用法。请特别注意,它rsync --exclude='/dir1' source destination
不会排除任何内容。
我认为您的exclude
路径需要相对于源路径。你能试试看吗?
rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/
这是一个测试,用于比较:
/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/
/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b
$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
--verbose
命令的输出显示的任何路径都是您必须使用的格式。
我在脚本中遇到了这个问题(我不知道这是否是您的情况)。我是因为我在脚本中使用了此命令,而我使用的是sh而不是bash。检查脚本开头的shebang。
如果您同步整个/ home路径,即不带斜杠,则排除模式将起作用:
rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/
但是最好只用斜杠将文件夹的内容同步:
rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/
您也可以使用忽略列表,请参阅:https : //askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders
为了排除带有rsync的specif文件夹,您需要考虑命令中的相对路径。在您的情况下:
rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/
其中“ ben”是您要同步的文件夹