如何在Rsync中排除文件和目录
Rsync是一个快速和多功能的命令行工具,它通过远程shell在两个地点之间同步文件和文件夹。
通过Rsync,你可以镜像数据,创建增量备份和在系统之间复制文件。当复制数据时,你可能想根据其名称或位置排除一个或多个文件或目录。
在本教程中,我们将向你展示如何用rsync排除文件和目录。
在开始之前
你应该对rsync的工作原理有基本的了解。
在下面的例子中,我们将使用rsync的-a
选项。这告诉rsync递归地同步目录,传输特殊和块状设备并保留符号链接、修改时间、组、所有权和权限。
当排除文件或目录时,你需要使用它们在源目录中的相对路径。
有两个选项可以指定你要排除的文件和目录。
- 从命令行中,使用
--exclude
选项。 - 从一个文件中,使用
--exclude-from
选项。
排除一个特定的文件
要排除一个特定的文件,请将该文件的相对路径传递给--exclude
选项。
在下面的例子中,文件src_directory/file.txt
将不会被传输。
rsync -a --exclude 'file.txt' src_directory/ dst_directory/
排除一个特定的目录
排除一个特定的目录和排除一个文件是一样的,只要把目录的相对路径传给--exclude
选项就可以了,如下:
rsync -a --exclude 'dir1' src_directory/ dst_directory/
如果你想排除目录内容,但不排除目录本身,请使用dir1/*
而不是dir1
。
rsync -a --exclude 'dir1/*' src_directory/ dst_directory/
排除多个文件或目录的情况
要排除多个文件或目录,只需指定多个--exclude
选项即可。
rsync -a --exclude 'file1.txt' --exclude 'dir1/*' --exclude 'dir2' src_directory/ dst_directory/
如果你喜欢使用单一的--exclude
选项,你可以用大括号{}
列出你要排除的文件和目录,用逗号隔开,如下图所示。
rsync -a --exclude={'file1.txt','dir1/*','dir2'} src_directory/ dst_directory/
如果你想排除的文件和/或目录的数量很大,你可以不使用多个--exclude
选项,而是在一个文件中指定你想排除的文件和目录,并将该文件传递给--exclude-from
选项。
下面的命令与上面的命令的作用完全相同。
rsync -a --exclude-from='exclude-file.txt' src_directory/ dst_directory/
file1.txt
dir1/*
dir2
根据一个模式排除多个文件或目录
通过rsync,你也可以根据与文件或目录名称相匹配的模式来排除文件和目录。
例如,要排除所有.jpg
的文件,你可以运行。
rsync -a --exclude '*.jpg*' src_directory/ dst_directory/
要排除所有其他的文件和目录,除了那些与某个模式相匹配的文件和目录之外,这一点比较棘手。比方说,你想排除所有其他文件和目录,除了以.jpg
结尾的文件。
一个选择是使用下面的命令。
rsync -a -m --include='*.jpg' --include='*/' --exclude='*' src_directory/ dst_directory/
当使用多个include/exclude选项时,第一个匹配规则适用。
--include='*.jpg'
- 首先,我们包括所有的.jpg
文件。--include='*/'
- 那么我们就包括src_directory
目录内的所有目录。如果没有这个,rsync将只复制顶级目录中的*.jpg
文件。-m
- 移除空的目录。
另一个选择是将find
命令的输出通过管道输送到rsync。
find src_directory/ -name "*.jpg" -printf %P\\0\\n | rsync -a --files-from=- src_directory/ dst_directory/
-printf %P\\0\\n
- 将删除文件路径中的src_directory/
。--files-from=-
- 表示只包括标准输入中的文件(从find命令中传递过来的文件)。
总结
在本教程中,你学到了在用Rsync传输数据时如何排除文件和目录。在Rsync用户手册页还有很多关于Rsync的知识。