Могу ли я использовать rsync для создания списка только измененных файлов?

26

Я использую 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
Джейсон М.
источник
→ см. Мой ответ здесь . Также -iдля подробностей, но с еще несколькими поворотами ...
Фрэнк

Ответы:

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

Символ >в первой позиции указывает, что файл был обновлен, оставшиеся символы указывают, почему, например, здесь, sи tуказывают, что размер файла и метка времени изменились.

Быстрый и грязный способ получить список файлов может быть:

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бы перечислял только измененные файлы (с другой контрольной суммой ), определенно хранитель, спасибо :) К вашему сведению, --dry-runиспользование команды вместо использования этой nопции - лучшая практика
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/+"
JDS
источник
3
sed->cut -d ' ' -f2,-
MUY Бельгия
-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner
Я не следую. Все 3 из этих файлов в примере помечены «> fcst», что, как я понимаю, означает «получать с удаленного устройства», контрольная сумма отличается, размер отличается, время отличается. Что в выводе указывает, что "только один файл изменился" ??
Бобпол
1

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

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

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

PS rsync версия 3.1.0

Cychih
источник
На самом деле в этом ответе упоминается этот вариант
Cychih