rsync
Rsync (Remote sync) 是一个文件同步工具,可以用于同步以下文件:
与 cp 和 scp 等文件全量复制工具不同的是,Rsync 可以实现增量同步,即只同步文件的修改部分,而不是复制整个文件。所以 Rsync 适合用于文件数量多、文件体积大的场景。
默认情况下,Rsync 只会同步文件大小修改或最后修改时间修改的文件。如果需要同步内容修改的文件,需要使用 --checksum 选项。
示例:一个增强版的 cp
下面示例是用于将本地 docs/markdown-pages/ 目录及其子目录 (--include='*/') 中的 TOC.md、_index.md 和 _docHome.md 文件同步到本地 docs-scaffold/markdown-pages/ 目录中 (--include='TOC.md' --include='_index.md' --include='_docHome.md' --exclude='*')。同时保证 docs-scaffold/markdown-pages/ 中只有这三个文件 (--delete)。
SRC="docs/markdown-pages/"
DEST="docs-scaffold/markdown-pages/"
rsync -av --delete --checksum --include='*/' --include='TOC.md' --include='_index.md' --include='_docHome.md' --exclude='*' "$SRC" "$DEST"
与 cp "$SRC" "$DEST" 不同的是,上面的 rsync 命令可以实现更细粒度的文件同步,例如只同步指定的文件、保持目标目录中只有指定的文件等。当 docs-scaffold 目录存在但是 markdown-pages 目录不存在时,cp 命令会报错,而 rsync 命令会自动创建 markdown-pages 目录。
在下面命令中,如果 docs-scaffold/markdown-pages 目录不存在,rsync 会报错。
rsync docs/markdown-pages/ docs-scaffold/markdown-pages/test/
过滤规则
The filter rules allow for flexible selection of which files to transfer (include) and which files to skip (exclude). The rules either directly specify include/exclude patterns or they specify a way to acquire more include/exclude patterns (e.g. to read them from a file).
As the list of files/directories to transfer is built, rsync checks each name to be transferred against the list of include/exclude patterns in turn, and the first matching pattern is acted on: if it is an exclude pattern, then that file is skipped; if it is an include pattern then that filename is not skipped; if no matching pattern is found, then the filename is not skipped.
Rsync builds an ordered list of filter rules as specified on the command-line.
在使用 --include 和 --exclude 时,Rsync 的过滤规则工作原理如下:
-
从命令行参数中读取
--include和--exclude规则,按照命令行参数的顺序,将规则添加到过滤规则列表中。 -
对于每一个文件和目录,Rsync 会从过滤规则列表的头部开始,检查它是否匹配列表中的每一个模式。它会在找到第一个匹配的模式时停止。
- 如果符合
--exclude规则,则跳过该文件。 - 如果符合
--include规则,则不跳过该文件。 - 如果没有匹配的规则,则不跳过该文件。
- 如果符合
所以同时使用 --include 和 --exclude 时,需要注意规则的顺序。
-
下面
rsync命令会跳过所有文件:rsync -av --exclude='*' --include='*.md' --exclude='*.txt' "$SRC" "$DEST" -
下面
rsync命令会同步所有文件,不仅仅是.md文件:rsync -av --include='*.md' "$SRC" "$DEST"
选项
-a, --archive
-a 选项等价于 -rlptgoD,即递归 (-r) + 保留所有属性 (-lptgoD)。
--delete
--delete 选项会让 Rsync 删除目标目录中存在但是源目录中不存在的文件。可以用于保持目标目录与源目录的一致性。
--include=PATTERN
--include 选项用于指定需要同步的文件。--include='*' 表示同步所有文件。关于过滤规则的更多信息,参考过滤规则。
--exclude=PATTERN
--exclude 选项用于指定哪些文件应该被忽略。--exclude='*' 表示忽略所有文件。关于过滤规则的更多信息,参考过滤规则。
-v, --verbose
-v 选项可以让 Rsync 输出一些基本的信息,例如哪些文件被同步了。
-vv 选项可以让 Rsync 输出更详细的信息,可以在 debug 时使用。
-c, --checksum
默认情况下,Rsync 只会同步文件大小修改或最后修改时间修改的文件。如果需要更精确地判断文件是否需要同步,可以使用 --checksum 选项,这样 Rsync 会检查文件的 checksum 值是否变化。
计算和校验 checksum 的过程会消耗大量的 IO 资源,所以会导致同步速度变慢。
-m, --prune-empty-dirs
-m 选项可以让 Rsync 不同步空的目录。
例如,下面的命令会同步 docs/markdown-pages/ 目录及其子目录中的所有文件,包括空的目录。
rsync -av docs/markdown-pages/ docs-scaffold/markdown-pages/
如果不想同步空的目录,可以使用 -m 选项。
rsync -avm docs/markdown-pages/ docs-scaffold/markdown-pages/