rsync 排除目录不起作用

rsync 排除目录不起作用

我正在运行 Fedora 17 64 位,但它rsync --exclude=/home/ben/<dir>没有按预期工作。

我正在尝试将rsync我的主目录复制到拇指驱动器,但我想排除某些保存缓存文件和构建文件的目录。这是我正在使用的命令:

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

~/build但是,和的内容~/.ccache正在被 复制rsync。我究竟做错了什么?

答案1

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

警告: 根据下面的 @rubo77 评论,只有当您愿意在源树中的所有位置(而不仅仅是根目录)排除这些项目时,才应使用此答案。请参阅上面 @jw013 的回答以获得更彻底的解释。

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

答案3

如果您 rsync 整个 /home 路径(即不带尾部斜杠),您的排除模式将起作用:

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

但最好只 rsync 带有尾部斜杠的文件夹内容:

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

答案4

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

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

其中“ben”是您正在同步的文件夹。

相关内容