如何排除rsync中的文件?

Sea*_*ene 12 server backup rsync

我正在使用 ubuntu 服务器 12.04,现在我想使用 rsync 备份一些文件,这里是一个尝试:

rsync -aAX $HOME/Documents/* $HOME/Backups/TEST --exclude={$HOME/Documents/another/*,$HOME/Documents/temp/*} 
Run Code Online (Sandbox Code Playgroud)

如您所见,我想将文件夹$HOME/Documents中的所有文件备份到文件夹$HOME/Backups/TEST,但排除文件夹anothertemp中的文件。但是我失败了,rsync 仍然复制了两个排除文件夹中的文件:

ls $HOME/Backups/TEST/another
test
Run Code Online (Sandbox Code Playgroud)

test是文件夹another中的一个文件,虽然我在 rsync 中排除了该文件,但它也被复制了,为什么?如何让这些文件被实际排除?

miv*_*ivk 12

您可能会发现.rsync-filter在源目录中添加文件并使用该-F选项更容易。

从手册页:

-F : -F 选项是此规则的简写 [...]:

 --filter='dir-merge /.rsync-filter'
Run Code Online (Sandbox Code Playgroud)

这告诉 rsync 查找已经散布在层次结构中的每个目录的 .rsync-filter 文件,并使用它们的规则来过滤传输中的文件。

例如:在 $HOME/Documents/.rsync-filter

# you can add comments in filter files

- /another/
- /temp/
Run Code Online (Sandbox Code Playgroud)

取而代之的是-,您也可以写出整个单词exclude

现在你可以

rsync -aAX -F $HOME/Documents/ $HOME/Backups/TEST/
Run Code Online (Sandbox Code Playgroud)


Tak*_*kat 11

您的 rsync 命令有几个问题(有关过滤规则的详细说明,另请参阅rsync 联机帮助页)。

  • --exclude对于任何给定的模式,我们都需要一个命令。
  • 给定的路径需要相对于源路径(没有绝对路径)。
  • 在我们声明来源和目的地之前需要给出选项。

对于您的示例,以下语法将起作用:

rsync -avAX --exclude=another/ --exclude=temp/ ~/Documents/ ~/Backups/TEST
Run Code Online (Sandbox Code Playgroud)

请注意,如果排除模式以/它结尾,则它指的是一个目录。如果两者都省略,则具有该名称的文件和目录将被排除。将其替换为通配符*以排除名称中包含该字符串的所有文件或目录。

  • 这并不完全正确。我不确定它是如何工作的,但从实验来看,`--exclude=/foo` 将直接在源代码中排除目录 `foo`,但 `--exclude=foo` 将排除任何名为 foo 的目录,即使在子目录。 (6认同)