Как я могу проверить, сделал ли rsync какие-либо изменения в bash?

12

У меня есть скрипт, который использует rsync для синхронизации данных в удаленном -> локальном сценарии. Сразу после запуска команды rsync проверьте, равен ли код ошибки нулю или нет. Если его ноль, дальнейшие команды выполняются. Это, однако, не учитывает тот факт, что rsync мог успешно работать, но не вносил никаких изменений. Из-за этого условие равного нуля будет выполняться независимо, что немного избыточно.

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

Что было бы лучшим подходом для расширения этого, чтобы проверить, действительно ли были какие-либо изменения, основанные на запущенной команде rsync Я читал, что флаг -i может обеспечить вывод на стандартный вывод, но как это можно поместить в условный блок?

Джеймс Уайт
источник
Вы попали -vтуда, поэтому он уже предоставляет информацию, необходимую вам для вывода ... например, список файлов, которые были фактически отправлены. Если ничего не изменилось, это просто ./.
Златовласка
Ах! Что если я убрал -v и вместо него использовал -i, а затем использовал непустую проверку строки в команде rsync?
Джеймс Уайт
Похоже, вы нашли решение самостоятельно? :-)
Бьорн Мунк
2
Вы можете использовать a=$("rsync command"). Это выполнит rsyncкоманду и сохранит stdoutв a. Тогда вы можете запустить тесты наa
nitishch
1
Вы также можете добавить a | grep /или что-то в этом роде, а затем проверить состояние выхода grep с помощью значения $?должно быть 1, если не было вывода.
Бьорн Мунк

Ответы:

9

Основываясь на комментариях к моему первоначальному вопросу, сделайте вывод 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

Потенциальный недостаток, вы должны потерять подробный вывод, но вы всегда можете записать его в файл.

Джеймс Уайт
источник
1

Я хотел более строгое решение. Я не хочу использовать grep Number of created files:(сообщение может быть на другом языке) или удалять все строки, кроме двух в -vвыводе (кто знает, какое резюме rsyncбудет напечатано в следующей версии?).

Я обнаружил, что вы можете установить формат rsyncжурнала, но не формат его стандартного вывода (см. 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
Виктор Сергиенко
источник