rsync排除目录不起作用


34

我正在运行64位的Fedora 17,rsync --exclude=/home/ben/<dir>并且无法按预期工作。

我正在尝试将rsync我的主目录移到拇指驱动器,但是我想当然排除包含缓存文件和构建文件的目录。这是我正在使用的命令:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

然而,从内容~/build~/.ccache正在被复制rsync。我究竟做错了什么?


1
我认为排除模式根本行不通。
索伦

Answers:


37

全球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/


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

11

我认为您的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

2
这个答案是错误的。使用相对排除路径,您将在任何地方排除模式!
rubo77

这篇文章是正确的。匹配是基于文本的,而不是基于文件inode的。该--verbose命令的输出显示的任何路径都是您必须使用的格式。
Sridhar Sarnobat,

这对我有用。
振宇

如果源路径是“ /”,那么绝对路径是相对路径,但仍然不起作用。
索伦

这是唯一对我有用的东西。
乔纳森

2

我在脚本中遇到了这个问题(我不知道这是否是您的情况)。我是因为我在脚本中使用了此命令,而我使用的是sh而不是bash。检查脚本开头的shebang。



0

为了排除带有rsync的specif文件夹,您需要考虑命令中的相对路径。在您的情况下:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/

其中“ ben”是您要同步的文件夹

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.