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

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

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

有没有人find一个方法来执行这样的任务?

# 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 

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

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

我试图找出何时引入--itemize-changes非常有用:

(and archives)

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

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

在这个例子中,根据文件本身的内容,只有一个文件已经改变。 但是,由于-n标志,没有文件同步

奖金

如果你想对已更改的文件运行chown,请使用sed或类似的方法parsing它们,然后使用xargs进行处理,例如:

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