I am using rsync in a bash script to keep files in sync between a few servers and a NAS. One issue I have run into is trying to generate a list of the files that have changed from the during the rsync.
The idea is that when I run rsync, I can output the files that have changed into a text file – more hoping for an array in memory – then before the script exists I can run a chown on only the changed files.
Has anyone found a way to perform such a task?
# 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
Best Answer
You can use rsync's
--itemize-changes
(-i
) option to generate a parsable output that looks like this:The
>
character in the first position indicates a file was updated, the remaining characters indicate why, for example heres
andt
indicate that the file size and timestamp changed.A quick and dirty way to get the file list might be:
rsync -ai src/ dest/ | egrep '^>'
Obviously more advanced parsing could produce cleaner output :-)
I came across this great link while trying to find out when
--itemize-changes
was introduced, very useful:http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (archived link)