我可以使用rsync创建仅更改文件的列表吗?


26

我在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

在这里看到我的回答。也-i用于逐项列出,但还有一些其他的变化……
Frank Nocke

Answers:


42

您可以使用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

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

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

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

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

我在尝试查找--itemize-changes引入时间时遇到了这个重要的链接,非常有用:

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


2
对于如上所述的更干净的输出,rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-run仅列出修改后的文件(不同的checksum),绝对是一个守护者thx :)仅供参考,--dry-runn我看来,FYI放在命令后而不是使用该选项是最佳实践
MediaVince

本质上与rsync -zavc src/ dest/ --dry-run没有详细说明相同
MediaVince

14

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

# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt

在此示例中,基于文件本身的内容,仅更改了一个文件。但是,由于存在该-n标志,因此未进行文件同步

奖金

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

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"

3
sed->cut -d ' ' -f2,-
MUY比利时

-n --dry-run-c --checksum-i --itemize-changes
ThorSummoner

我没有关注。示例中的所有3个文件都标记为“> fcst”,据我理解这意味着“正在从远程接收”,校验和不同,大小不同,时间不同。输出中的内容表明“仅一个文件已更改”?
bobpaul

1

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

-i 是的快捷方式 --out-format=%i%n%L

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

PS rsync版本3.1.0


实际上,此答案提到了该选项
Cychih
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.