如何从 rsync 输出已更改文件的列表?

Jas*_* M. 33 scripting bash rsync

我在 bash 脚本中使用 rsync 来保持几个服务器和 NAS 之间的文件同步。我遇到的一个问题是尝试生成在 rsync 期间已更改的文件列表。

这个想法是,当我运行 rsync 时,我可以将已更改的文件输出到文本文件中 - 更希望内存中有一个数组 - 然后在脚本存在之前,我可以对已更改的文件运行 chown 。

有没有人找到一种方法来执行这样的任务?

# specify the source directory
source_directory=/Users/jason/Desktop/source

# specify the destination directory
# DO NOT ADD THE SAME DIRECTORY NAME AS RSYNC WILL CREATE IT FOR YOU
destination_directory=/Users/jason/Desktop/destination

# run the rsync command
rsync -avz $source_directory $destination_directory

# grab the changed items and save to an array or temp file?

# loop through and chown each changed file
for changed_item in "${changed_items[@]}"
do
        # chown the file owner and notify the user
        chown -R user:usergroup; echo '!! changed the user and group for:' $changed_item
done
Run Code Online (Sandbox Code Playgroud)

Kyl*_*ith 53

您可以使用 rsync 的--itemize-changes( -i) 选项生成如下所示的可解析输出:

~ $ rsync src/ dest/ -ai
.d..t.... ./
>f+++++++ newfile
>f..t.... oldfile

~ $ echo 'new stuff' > src/newfile

~ $ !rsync
rsync src/ dest/ -ai
>f.st.... newfile
Run Code Online (Sandbox Code Playgroud)

>一个位置的字符表示文件已更新,其余字符表示更新原因,例如此处st表示文件大小和时间戳已更改。

获取文件列表的一种快速而肮脏的方法可能是:

rsync -ai src/ dest/ | egrep '^>'

显然更高级的解析可以产生更清晰的输出:-)

我在尝试找出何时--itemize-changes引入时遇到了这个很棒的链接,非常有用:

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html(存档链接)

  • 对于前面提到的更清晰的输出,`rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-run` 只会列出修改后的文件(**不同的校验和**),绝对是一个管理员,谢谢:) 仅供参考,在命令之后放置 `--dry-run` 而不是使用`n` 选项对我来说是最佳实践 (2认同)
  • 太棒了,我不知道使用以前的参数的 `!` 语法...非常感谢! (2认同)

JDS*_*JDS 19

使用-n标志,结合-c校验和标志和-i标志:

# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt
Run Code Online (Sandbox Code Playgroud)

在此示例中,根据文件本身的内容(由校验和确定),三个文件已更改。但是,由于-n标志的原因,没有进行文件同步

奖金

如果要对更改的文件运行 chown,请使用sed或类似的方法解析它们并使用 xargs 进行处理,例如:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"
Run Code Online (Sandbox Code Playgroud)

  • `sed` -> `cut -d' ' -f2,-` (4认同)
  • `-n --dry-run`、`-c --checksum`、`-i --itemize-changes` (4认同)
  • 我不跟了。示例中的所有 3 个文件都标记为“>fcst”,我理解这意味着“从远程接收”,校验和不同,大小不同,时间不同。输出中什么表明“只有一个文件已更改”? (2认同)

小智 7

这个问题有点老了,但我认为值得补充:

-i 是捷径 --out-format=%i%n%L

%n装置的文件名,(部分log formatman rsyncd.conf

PS rsync 版本 3.1.0