Rsync 是一个非常强大的工具,可以在两个不同的位置(或服务器)之间进行备份或同步文件和目录。
您已经知道这一点,因为我们之前向您展示了有关rsync的实际示例。
在典型的备份情况下,您可能希望从备份中排除一个或多个文件(或目录)。您可能还想从 rsync 中排除特定的文件类型。
本文通过示例解释了如何在 rsync 期间忽略多个文件和/或目录。
首先,创建一个示例目录结构,如下所示(带有一些空文件),可用于测试目的。
$ cd ~
$ mkdir -p source/dir1/dir2
$ mkdir -p source/dir3
$ touch source/file1.txt
$ touch source/file2.txt
$ touch source/dir1/dir2/file3.txt
$ touch source/dir3/file4.txt
上面的命令将创建一个具有以下结构的源目录(在您的主目录下)。
source
- file1.txt
- file2.txt
- dir1
- dir2
- file3.txt
- dir3
- file4.txt
1.排除特定目录
如果您不想将 dir1(包括它的所有子目录)从源文件夹同步到目标文件夹,请使用 rsync –exclude 选项,如下所示。
$ rm -rf destination
$ rsync -avz --exclude 'dir1' source/ destination/
building file list ... done
created directory dest
./
file1.txt
file2.txt
dir3/
dir3/file4.txt
验证以确保 dir1 未从源目录复制到目标目录。
$ find destination
destination
destination/file2.txt
destination/file1.txt
destination/dir3
destination/dir3/file4.txt
2.排除多个匹配模式的目录
以下示例将排除 source/ 下与模式“dir*”匹配的任何目录(或子目录)
$ rm -rf destination
$ rsync -avz --exclude 'dir*' source/ destination/
building file list ... done
created directory destination
./
file1.txt
file2.txt
验证目标目录以确保它没有复制任何包含关键字“dir”的目录。
$ find destination
destination
destination/file2.txt
destination/file1.txt
3.排除特定文件
要排除特定文件,请在排除选项中使用文件的相对路径,如下所示。
$ rm -rf destination
$ rsync -avz --exclude 'dir1/dir2/file3.txt' source/ destination/
building file list ... done
created directory destination
./
file1.txt
file2.txt
dir1/
dir1/dir2/
dir3/
dir3/file4.txt
验证目标目录以确保它没有复制特定文件(本示例中为 dir1/dir2/file3.txt)。
$ find destination
destination
destination/file2.txt
destination/file1.txt
destination/dir1
destination/dir1/dir2
destination/dir3
destination/dir3/file4.txt
4.排除路径总是相对的
如果你不小心,你可能会犯这个错误。
在以下示例中,exclude 选项似乎具有完整路径(即/dir1/dir2/file3.txt)。但是,从 rsync 的角度来看,排除路径始终是相对的,它将被视为 dir1/dir2/file3.txt。在下面的示例中,rsync 将在源目录下(而不是 / 根目录下)查找 dir1。
$ rsync -avz --exclude '/dir1/dir2/file3.txt' source/ destination/
因此,上述命令与以下命令完全相同。只是为了避免混淆(并使其易于阅读),不要在排除路径前给出 / 。
$ rsync -avz --exclude 'dir1/dir2/file3.txt' source/ destination/
5.排除特定文件类型
要排除具有特定扩展名的特定文件类型,请使用适当的模式。例如,要排除所有包含 .txt 作为扩展名的文件,请执行以下操作。
$ rsync -avz --exclude '*.txt' source/ destination/
building file list ... done
created directory destination
./
dir1/
dir1/dir2/
dir3/
验证目标目录以确保它没有复制 *.txt 文件。
$ find destination
destination
destination/dir1
destination/dir1/dir2
destination/dir3
注意:当您要备份主目录但排除所有具有特定文件扩展名的巨大图像和视频文件时,上述内容非常有用。
6.同时排除多个文件和目录
当您想要排除多个文件和目录时,您始终可以在命令行中指定多个 rsync 排除选项,如下所示。
$ rsync -avz --exclude file1.txt --exclude dir3/file4.txt source/destination/
等待。如果我有大量文件要从 rsync 中排除怎么办?
我不能继续在命令行中使用多个 –exclude 添加它们,这很难阅读,并且很难在以后重新使用 rsync 命令。
因此,更好的方法是使用 rsync –exclude-from 选项,如下所示,您可以在其中列出要在文件中排除的所有文件(和目录)。
首先,创建一个包含您不想备份的所有文件和目录的列表的文本文件。这是您要从 rsync 中排除的文件和目录的列表。
$ vim exclude-list.txt
file1.txt
dir3/file4.txt
接下来,使用 –exclude-from 选项和 exclude-list.txt 执行 rsync,如下所示。
$ rm -rf destination
$ rsync -avz --exclude-from 'exclude-list.txt' source/ destination/
building file list ... done
created directory destination
./
file2.txt
dir1/
dir1/dir2/
dir1/dir2/file3.txt
dir3/
验证目标目录以确保 exclude-list.txt 文件中列出的文件和目录未备份。
$ find destination
destination
destination/file2.txt
destination/dir1
destination/dir1/dir2
destination/dir1/dir2/file3.txt
destination/dir3