我在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
第一个位置的>
字符表示文件已更新,其余字符表示为什么,例如这里s
和t
表示文件大小和时间戳已更改。
获取文件列表的一个快速和肮脏的方式可能是:
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/+"