Я использую 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
для подробностей, но с еще несколькими поворотами ...Ответы:
Вы можете использовать опцию rsync
--itemize-changes
(-i
), чтобы сгенерировать вывод, который выглядит следующим образом:Символ
>
в первой позиции указывает, что файл был обновлен, оставшиеся символы указывают, почему, например, здесь,s
иt
указывают, что размер файла и метка времени изменились.Быстрый и грязный способ получить список файлов может быть:
rsync -ai src/ dest/ | egrep '^>'
Очевидно, что более продвинутый синтаксический анализ может привести к более чистому выводу :-)
Я наткнулся на эту замечательную ссылку, пытаясь выяснить, когда она
--itemize-changes
была представлена, очень полезно:http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (архивная ссылка)
источник
rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-run
бы перечислял только измененные файлы (с другой контрольной суммой ), определенно хранитель, спасибо :) К вашему сведению,--dry-run
использование команды вместо использования этойn
опции - лучшая практикаrsync -zavc src/ dest/ --dry-run
без многословияИспользуйте
-n
флаг в сочетании с-c
флагом контрольной суммы и-i
флагом:В этом примере изменился только один файл в зависимости от содержимого самого файла. Однако синхронизация файлов не выполняется из-за
-n
флагабонус
Если вы хотите запустить chown для измененных файлов, проанализируйте их с помощью
sed
или аналогичным образом и обработайте с помощью xargs, например:источник
sed
->cut -d ' ' -f2,-
-n --dry-run
,-c --checksum
,-i --itemize-changes
Этот вопрос немного устарел, но я думаю, что стоит добавить:
-i
это ярлык--out-format=%i%n%L
И
%n
означает имя файла, (разделlog format
оman rsyncd.conf
)PS rsync версия 3.1.0
источник