如果您可以信任文件系统上次修改的时间戳,则可以通过将Rsync与UNIX / Linux“查找”实用程序结合使用来加快处理速度。'find'可以汇编显示过去一天中最后修改时间的所有文件的列表,然后仅将缩短的文件/目录列表通过管道传送到Rsync。这比让Rsync将发件人上的每个文件的元数据与远程服务器进行比较要快得多。
简而言之,以下命令将仅在最近24小时内已更改的文件和目录列表上执行Rsync:(Rsync不会费心检查任何其他文件/目录。)
find /local/data/path/ -mindepth 1 -ctime -0 -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
如果您对'find'命令不熟悉,它将通过特定的目录子树递归,查找符合您指定条件的文件和/或目录。例如,此命令:
find . -name '\.svn' -type d -ctime -0 -print
将从当前目录(“。”)开始,并遍历所有子目录,查找:
- 任何目录(“ -d型”),
- 名为“ .svn”(“-name'.svn'”),
- 最近24小时内修改过的元数据(“ -ctime -0”)。
它在标准输出上打印符合这些条件的所有内容的完整路径名(“ -print”)。选项“ -name”,“-type”和“ -ctime”称为“测试”,选项“ -print”称为“动作”。“查找”的手册页包含测试和操作的完整列表。
如果您想变得真正聪明,可以使用'find'命令的'-cnewer'测试,而不是'-ctime',以使此过程更具容错性和灵活性。'-cnewer'测试树中的每个文件/目录是否都比某些参考文件更新了其元数据。在每次运行开始时,在“查找...”之前,使用“触摸”创建下一个运行的参考文件。rsync ...”命令执行。这是基本的实现:
#!/bin/sh
curr_ref_file=`ls /var/run/last_rsync_run.*`
next_ref_file="/var/run/last_rsync_run.$RANDOM"
touch $next_ref_file
find /local/data/path/ -mindepth 1 -cnewer $curr_ref_file -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
rm -f $curr_ref_file
该脚本会自动知道上次运行的时间,并且仅传输自上次运行以来修改的文件。尽管这比较复杂,但是它可以保护您避免因停机或其他错误而错过了超过24小时的运行时间。