Я использую 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
(архивирование, контрольная сумма и сжатие) также.