使用 Linux 上的 rsync 复制文件时过滤文件
简介
Linux 命令行实用程序 rsync 是一种功能强大且灵活的工具,用于在不同的计算机和位置之间同步文件和目录。它通常用于各种任务,包括备份、文件传输和数据复制。rsync 的主要功能之一是能够根据各种条件(例如文件类型、大小和修改时间)过滤文件。在本文中,我们将详细探讨如何在 Linux 系统上使用 rsync 过滤器在目录同步期间选择性地复制文件。
Rsync 概述
Rsync 是一种功能强大且高效的文件传输工具,允许用户在不同系统之间同步文件和目录。它的工作原理是比较源目录和目标目录,并仅复制已更改或添加到源目录的文件。此功能使 rsync 成为通过网络传输大量数据的理想工具,因为它最大限度地减少了需要传输的数据量。此外,rsync 还可用于删除源目录中不再存在的文件,使其成为维护多个系统之间文件一致性的通用工具。
使用 include 选项
rsync 最强大的功能之一是能够根据各种条件(例如文件类型、大小和修改时间)过滤文件。include 选项是一个强大的工具,允许用户选择性地仅复制某些类型的文件。include 选项与 exclude 选项结合使用,exclude 选项用于根据特定条件排除文件。
例如,假设您只想传输当前目录中的文本文件。我们将使用 include 选项来过滤我们要传输的文件,并使用通配符与 exclude 选项来排除所有其他文件 -
$ rsync --include=*.txt --exclude=* /source/* /destination/
在此示例中,选项的顺序很重要。include 和 exclude 选项是过滤器,并按指定的顺序应用。因此,我们首先必须使用表示我们要传输的文件的过滤器,然后排除所有其他内容。运行此命令时,源目录中的所有文本文件都将被选中以进行传输,所有其他文件都将被排除。
我们还可以使用多个 include 选项来传输多种文件类型。例如,如果我们想传输文本文件和日志文件,我们可以为每个文件使用一个 include 选项,然后是 exclude 选项 -
$ rsync --include=*.txt --include=*.log --exclude=* /source/* /destination/
递归遍历子目录
在某些情况下,我们可能希望传输源目录所有子目录中符合特定条件的文件。为此,我们可以使用-a 和-r 选项来遍历子目录。例如,要传输源目录所有子目录中的所有文本文件,我们可以使用以下命令 -
$ rsync -ar --include=*/ --include=*.txt --exclude=* /source/* /destination/
但是,此命令有可能复制所有子目录(无文件),因此我们还需要使用--prune-empty-dirs 或-m 选项来防止这种情况发生 -
$ rsync -ar --prune-empty-dirs --include=*/ --include=*.txt --exclude=* /source/* /destination/
高级过滤
Rsync 提供了一些高级过滤器选项,可用于根据更复杂的条件过滤文件。其中包括能够根据文件大小、修改时间和文件属性进行过滤。
例如,以下命令将“/source/”目录中大于 100 MB 的所有文件同步到“/destination/”目录 -
$ rsync -av --size-gt 100M /source/ /destination/
再举一个例子,以下命令将“/source/”目录中过去 30 天内更改的所有文件同步到“/destination/”目录 -
$ rsync -av --ignore-existing --modify-window=30 /source/ /destination/
版本和变体
需要注意的是,rsync 命令的行为和语法在不同版本之间可能会有所不同。本教程基于版本 3.2.4。rsync 的最新版本可在官方网站上获得 -
https://rsync.samba.org。始终建议查阅您正在使用的特定版本的文档,以确保本教程中使用的命令和选项按预期工作。
结论
Rsync 是一个功能强大且通用的工具,用于在 Linux 系统上同步文件和目录。它能够根据各种条件(例如文件类型、大小和修改时间)过滤文件,使其成为各种任务的有用工具,包括备份、文件传输和数据复制。include 选项尤其是一个强大的工具,允许用户选择性地仅复制某些类型的文件,使其成为管理和维护多个系统之间文件一致性的宝贵工具。通过正确使用 include 和 exclude 选项,结合能够调出子目录和高级过滤选项,rsync 可以成为任何 Linux 系统管理员工具箱中的重要工具。