Як я можу перевірити, чи 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 може забезпечити вихід для stdout, але як це можна помістити в умовний блок?


Ви потрапили -vтуди, тому він вже надає інформацію, яку потрібно викреслити ... наприклад, список файлів, які були фактично надіслані. Якщо нічого не зміниться, це просто ./.
goldilocks

Ах! Що робити, якщо я вийняв -v і використовую -i замість цього, а потім використовую перевірку непорожнього рядка для команди rsync?
Джеймс Уайт

Схоже, ви самі знайшли рішення? :-)
Бьорн Манч

2
ви можете використовувати a=$("rsync command"). Це виконає rsyncкоманду і збережеться stdoutв a. Тоді ви можете запустити тести наa
nitishch

1
Ви також можете додати | 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

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

Я виявив, що ви можете встановити формат 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.