如何使用rsync排除多个目录?

Fre*_*Ben 219 command-line rsync

我正在尝试使用 rsync 备份我的主目录,并且我想排除一些包含垃圾的目录。我想特别排除/home/ben/.ccache/home/ben/build。不幸的是,rsync 的文档信息过载,并没有回答我的问题。这是我尝试过的:

rsync -arv --exclude "/home/ben/.ccache:/home/ben/build" /home/ben /media/ben/thumbdrive/
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

Fre*_*Ben 283

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

rsync -arv --exclude=.ccache --exclude=build /home/ben /media/ben/thumbdrive/
Run Code Online (Sandbox Code Playgroud)

注意:使用排除的相对路径。路径是相对于源目录的,这里是 /home/ben。

  • 绝对路径对我来说*不*工作(指定的目录没有被静默排除),而相对于源目录的路径工作正常。也许我遗漏了一些东西,但我对@FreeSoftwareServers 的绝对路径总是有效的断言持谨慎态度。 (9认同)
  • 仅供参考:选项`-a` 包括`-r` 所以`-ar` 是多余的。 (9认同)
  • 与 FreeSoftwareServers 认为的相反,排除路径是相对于源路径的,而不是 /。因此,该评论绝对是错误的,如果您遵循它,将导致失败。最好的策略是在排除项中去掉前导 / 以避免这种类型的心理错误。如果源是说 /home/me 并且如果您 exclude='/mydir/' 这将排除 /home/me 中的目录 mydir,也就是说,它排除 /home/me/mydir 而不是 /mydir/ 在 /。不幸的是,我无法否决或编辑该评论,因为它在技术上是错误的并且会误导。 (9认同)
  • 仅供后来的旅行者参考,@FreeSoftwareServer 的相关评论似乎已被删除。tl;dr:使用相对路径 (6认同)
  • 如果您是愚蠢的,那么我和其他 179 名支持者也是如此! (3认同)

use*_*759 130

当有多个目录和/或文件要排除时,制作一个文本文件并使用--exclude-from开关。创建一个名为的文件,exclude_me.txt并在其中列出您的排除项。示例 ( /home/ben/exclude_me.txt):

.ccache
build
.java
.gvfs
.xsession-errors
Run Code Online (Sandbox Code Playgroud)

然后你的 rsync 看起来像这样:

rsync -arv --exclude-from='/home/ben/exclude_me.txt' /home/ben /media/ben/thumbdrive/
Run Code Online (Sandbox Code Playgroud)

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

  • /dir/ 表示排除根文件夹 /dir
  • /dir/*意味着获取根文件夹/dir而不是内容
  • dir/ 意味着排除名称包含的任何文件夹 dir/

  • 排除的示例:/dir/, /usr/share/directory/, /var/spool/dir/ /var/spool/lpd/cf意味着跳过以其中cf任何文件夹开头的文件/var/spool/lpd

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

  • 需要注意的是,*root 文件夹* 表示传输的*根目录*,而不是根目录。 (10认同)
  • 终于有人在rsync的排除选项+1中解释了`/dir/`和`dir/`之间的区别 (2认同)

小智 101

您还可以排除大括号内的多个路径:

rsync -arv --exclude={.ccache,build} /home/ben /media/ben/thumbdrive/
Run Code Online (Sandbox Code Playgroud)

  • 这很好用,只是不在 sh 下,只有在 bash 下,我发现了“艰难的方式” (49认同)
  • 逗号后没有空格。也学到了艰难的方式 (14认同)
  • 它还可以在路径中间进行大括号扩展,例如 `--exclude=/folder/{one,two}/*` (6认同)
  • 并且不要使用像 --exclude='.gvfs' 这样的 '' (2认同)
  • 这样做的原因是因为“支撑扩展”,以防有人想查看细节。 (2认同)