rsync 排除目录不起作用

Fre*_*Ben 48 rsync

我正在运行 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/.

  • 关键细节是斜线很重要。如果在源目录(rsync -a source/destination)的末尾附加斜杠,它将复制源的内容,否则`rsync -a source destination` 将源目录本身复制到目标。这决定了传输的根是什么,以便通知排除表达式。然后在上面解释了排除表达式中 / 的正确使用。请特别注意,`rsync --exclude='/dir1' source destination` 不会排除任何内容。 (5认同)

小智 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)

  • 这个答案是错误的。使用相对排除路径,您可以在任何地方排除模式! (4认同)
  • 这是唯一对我有用的事情。 (2认同)

rub*_*o77 5

如果您 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