Основываясь на комментариях к моему первоначальному вопросу, сделайте вывод rsync в stdout с флагом -i и используйте условие проверки нестрокового кода, чтобы посмотреть, действительно ли что-то изменилось в процессе проверки кода ошибки. Обертывание команды rsync в переменную позволяет выполнить проверку.
RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)
if [ $? -eq 0 ]; then
# Success do some more work!
if [ -n "${RSYNC_COMMAND}" ]; then
# Stuff to run, because rsync has changes
else
# No changes were made by rsync
fi
else
# Something went wrong!
exit 1
fi
Потенциальный минус - вы должны потерять многословный вывод, но вы всегда можете записать его в файл вместо этого.
Я хотел более строгого решения. Я не хочу использовать grep дляNumber of created files:
(сообщение может быть на другом языке )или удалить все строки, кроме двух, в -v
вывод (кто знает, какое резюме rsync
будет напечатано в следующей версии? ).
edit:Я обнаружил, что вы можете установить формат вывода rsync
для списка измененных файлов с помощью--out-format
:
rsync -a --verbose source-dir target-dir \
--out-format='changed file: %i %n%L' \
| fgrep 'changed file:'
Или, если вас не волнует время файла, но вы хотите сделать минимальное копирование, вариант с расширенным и очищенным-a
:
rsync -r --links --devices --specials \
--delete --checksum \
--omit-dir-times --omit-link-times --ignore-times \
--prune-empty-dirs \
--verbose \
source-dir target-dir
Старый ответ :Я обнаружил, что вы можете установить формат журнала rsync
, но не формат его stdout (см.man rsyncd.conf
).
Например, добавьте «Файл изменен!» на каждую строку с реально измененным файлом, а затем grep
для него:
rsync -a \
--log-file=/tmp/rsync.log \
--log-file-format="File changed! %f %i" \
source-dir target-dir
if fgrep "File changed!" /tmp/rsync.log > /dev/null; then
echo "rsync did something!"
fi