Назад | Перейти на главную страницу

Как вывести список измененных файлов из rsync?

Я использую rsync в сценарии bash, чтобы синхронизировать файлы между несколькими серверами и 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

Вы можете использовать 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 '^>'

Очевидно, что более продвинутый синтаксический анализ может дать более чистый результат :-)

Я наткнулся на эту замечательную ссылку, пытаясь узнать, когда --itemize-changes был представлен, очень полезно:

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (ссылка в архиве)

Использовать -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/+"

Этот вопрос немного устарел, но я думаю, что его стоит добавить:

-i это ярлык --out-format=%i%n%L

И %n означает имя файла, (раздел log format из man rsyncd.conf)

P.S. rsync версии 3.1.0

Обобщая несколько других ответов (особенно @ Cychih's), вы можете получить список измененных файлов следующим образом:

rsync --out-format='%n' src/ dest/

Что напечатает только измененные файлы, например;

rsync --out-format='%n' src/ dest/
a.txt
bcde.txt
b.txt

Вы можете сохранить это в списке следующим образом:

changed_items=($(rsync --out-format='%n' src/ dest/))
for item in "${items[@]}"; do
   echo $item
   echo $item
done

Вы можете передать их другой команде следующим образом:

rsync --out-format='%n' src/ dest/ | xargs open

Обратите внимание, что очень часто включают -acz (архивирование, контрольная сумма и сжатие) также.