我正在尝试使用rsync备份主目录,并且我想排除一些包含垃圾内容的目录。我想专门排除/home/ben/.ccache/home/ben/build。不幸的是rsync的文档信息过多,无法回答我的问题。这是我尝试的方法:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/


什么是正确的方法?

评论

只是想说标志a已经暗示r :) -a,--archive存档模式;等于-rlptgoD(没有-H,-A,-X)

#1 楼

好吧,我真的很傻。在我发布这个问题之前,我的朋友向我展示了如何做,这确实很简单。要排除多个目录,您只需使用多个--exclude=path开关。因此,我上面正确编写的命令如下:

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


评论


绝对路径对我不起作用(指定的目录没有被静默排除),而相对于源目录的路径则正常工作。也许我缺少了一些东西,但对于@FreeSoftwareServers断言绝对路径始终有效的断言,我会持谨慎态度。

–索伦·比约恩斯塔德(Soren Bjornstad)
16年8月20日在19:43

仅供参考:选项-a包括-r so -ar是多余的。

–大卫
17年8月8日在14:01

与FreeSoftwareServers所认为的相反,排除路径是相对于源路径而不是/的。因此,该注释绝对是错误的,如果您遵循它,将会导致失败。最好的策略是不使用前导/排除,以免出现这种类型的精神错误。如果将源称为/ home / me,并且如果您排除='/ mydir /',则这将排除/ home / me中的目录mydir,也就是说,它将排除/中的/ home / me / mydir NOT / mydir /。不幸的是,由于技术上的错误并会误导我,我无法对此评论进行投票或编辑。

–蜥蜴
17 Sep 6'0:09



仅供参考,供以后的旅行者使用,看来@FreeSoftwareServer的有问题评论已被删除。 tl; dr:使用相对路径

– Freedom_Ben
17年9月6日在16:25

如果您很笨,那么我和其他179位支持者也一样!

– Sridhar Sarnobat
18-09-22在4:48

#2 楼

如果要排除多个目录和/或文件,请制作一个文本文件,然后使用--exclude-from开关。制作一个名为exclude_me.txt的文件,并在其中列出您的排除项。
示例(/home/ben/exclude_me.txt): >
.ccache
build
.java
.gvfs
.xsession-errors


这是有关过滤规则的一些信息,可能会有所帮助:



/dir/表示排除根文件夹/dir


/dir/*表示获取根文件夹/dir,但没有内容
dir/表示在名称包含dir/的任何地方排除任何文件夹
示例除外:/dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cf表示跳过以以下内容开头的文件cf中任何文件夹中的/var/spool/lpd


另请参见手册页上的过滤规则部分。

评论


请务必注意,根文件夹是指传输的根,而不是根目录。

–詹姆士林
18/09/10在20:12

这是一个绝妙的答案!

–亚历山大·朱可夫(Alexander Zhukov)
19年8月29日在9:04

最后有人在rsync的排除选项+1中解释了/ dir /和dir /之间的区别

– 4级
19-10-14在15:54



#3 楼

您还可以在花括号中排除多个路径:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/


评论


这很好,只在sh之下,而在bash之下,我发现了“困难的方法”

–xor
2015年10月1日,9:56

逗号后没有空格。学会了艰辛的方式😭

– styl3r
18年5月25日在5:21

而且不要像--exclude ='。gvfs'这样使用''

– Martin T.
18年11月21日在9:03

之所以起作用,是因为“大括号扩展”,以防万一有人想看细节。

– shredalert
19年5月5日在12:50

它还可以在路径中间进行括号扩展,例如--exclude = / folder / {one,two} / *

–mbomb007
19-09-10在21:03