如何判断通过 rsync 更新的文件是否已更新

如何判断通过 rsync 更新的文件是否已更新

我认为这很简单,但我在谷歌搜索中找不到任何东西,也许我搜索了错误的术语。

我有一台可以与另一台机器同步的机器。如果远程机器上的文件发生更改,则我需要在本地机器上运行其他脚本。但是,我似乎无法弄清楚如何在 rsync 命令上设置条件,以允许它仅在文件已更改/更新时运行其他脚本。

提前感谢!

答案1

没有明显的答案,比如一个选项,让你指定在发现更改时运行的脚本。但是,你可以使用该--stats标志来生成有关所发生情况的统计数据,解析它们,并做出有根据的猜测。

$ rsync -avP --stats src dest 
sending incremental file list
...

Number of files: 10
Number of files transferred: 2
Total file size: 27 bytes
Total transferred file size: 27 bytes
Literal data: 27 bytes
Matched data: 0 bytes
File list size: 253
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 411
Total bytes received: 82

sent 411 bytes  received 82 bytes  986.00 bytes/sec
total size is 27  speedup is 0.05

你可以捕捉它并寻找Number of files transferred: 2

$ rsync -avP --stats src dest | grep 'Number of files transferred:' 
Number of files transferred: 0
$ touch src/another
$ rsync -avP --stats src dest | grep 'Number of files transferred:'
Number of files transferred: 1

或者,为了更加谨慎,捕获输出并报告文件数量或未找到该行的情况(以防报告统计数据的方式发生变化)。

#!/bin/bash

set -e

tmpfile=$(mktemp)

rsync -avP --stats src dest | grep 'Number of files transferred:' >"$tmpfile"

if [[ $(wc -l < "$tmpfile") == "1" ]]; then
  changedfiles=$(awk '{ print $5 }' <"$tmpfile")
else
  changedfiles="ERROR"
fi
rm -f "$tmpfile"

echo CHANGEDFILES="$changedfiles"

相关内容