我正在运行 Fedora 17 64 位,但rsync --exclude=/home/ben/<dir>
没有按预期工作。
我正在尝试将rsync
我的主目录转到拇指驱动器,但我想排除包含缓存文件和构建文件的目录。这是我正在使用的命令:
rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/
Run Code Online (Sandbox Code Playgroud)
然而,从内容~/build
和~/.ccache
正在被复制rsync
。我究竟做错了什么?
jw0*_*013 52
全球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)
手册页的“ANCHORING INCLUDE/EXCLUDE PATTERNS”部分找到。
请注意,简单地省略前导/
不一定是您想要的。从同一手册页部分再次引用:
不合格的“foo”将匹配树中任何地方的“foo”名称,因为该算法是从上到下递归应用的;它的行为就像每个路径组件在文件名结尾处轮流。即使未锚定的“sub/foo”也会在层次结构中的任何点匹配,其中在名为“sub”的目录中找到“foo”。有关如何指定在传输的根处匹配的模式的完整讨论,请参阅关于 ANCHORING INCLUDE/EXCLUDE PATTERNS 的部分。
因此, 的过滤器模式build/
将匹配 中任何位置的构建目录/home/ben
,甚至/home/ben/many/sub/directories/build/
.
小智 13
警告: 根据下面@rubo77 的评论,只有当您愿意在源树中的任何地方(而不仅仅是根)排除这些项目时,才应使用此答案。有关更详尽的解释,请参阅上面@jw013 的回答。
我认为您的exclude
路径需要相对于源路径。你可以试试这个吗?
rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/
Run Code Online (Sandbox Code Playgroud)
这是一个测试,用于比较:
/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
Run Code Online (Sandbox Code Playgroud)
如果您 rsync 整个 /home 路径,即没有尾部斜杠,您的排除模式将起作用:
rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/
Run Code Online (Sandbox Code Playgroud)
但最好只用尾部斜杠 rsync 文件夹的内容:
rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/
Run Code Online (Sandbox Code Playgroud)
您也可以使用忽略列表,请参阅:https : //askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders