我正在运行 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”是您正在同步的文件夹。