тест синхронизации директорий с помощью rsync

Вопрос или проблема

Есть ли способ узнать из bash-скрипта, когда команда rsync ничего не скачивает (т.е. папка синхронизирована)? Я пробовал использовать код завершения, но он отличается только в случае ошибки.

Пример rsync, скачивающего только файлы, которые не синхронизированы:

$ rsync -av –progress humbo@hkremote:/home/humbo/dumps/*.gz .

получение списка файлов ...
9 файлов для рассмотрения
_dump_7.gz
    35927279 100%    1.19MB/s    0:00:28 (xfer#1, to-check=1/9)
_dump_8.gz
    39387704 100%    1.17MB/s    0:00:32 (xfer#2, to-check=0/9)

отправлено 64 байта  получено 75324472 байта  1205192.58 байта/с
общий размер 354448073  ускорение 4.71

$ echo $?

0

Файлы синхронизированы:

$ rsync -av –progress humbo@hkremote:/home/humbo/dumps/*.gz .

получение списка файлов ...
9 файлов для рассмотрения

отправлено 20 байт  получено 205 байт  90.00 байт/с
общий размер 354448073  ускорение 1575324.77

$ echo $?

0

Вы можете использовать rsync --stats, затем использовать grep "Number of files transferred" и затем вывести эту статистику с помощью awk, вот так:

rsync -av --stats --progress humbo@hkremote:/home/humbo/dumps/*.gz . | grep 'Number of files transferred' | awk -F ": " '{print $2}'

Этот результат равен 0, когда ничего не передано.

У rsync нет кода завершения, который отличался бы при копировании по сравнению с ситуацией, когда ничего не копируется. Коды завершения только для ошибок, связанных с копированием. Вам нужно будет написать некоторую логику вокруг функции в bash-скрипте, чтобы определить, что не было скопировано ни одного файла.

http://wpkg.org/Rsync_exit_codes

Никогда этого не делал, но это может сработать, если ваши директории не слишком большие.

Создайте md5sum перед началом вашего rsync и сравните с md5sum после завершения. Что-то вроде этого:

#!/bin/bash
md5sum=$(ssh humbo@hkremote tar -c /home/humbo/dumps|md5sum)
.
.
# Остальная часть вашего скрипта здесь
.
.
md5sum_after_rsync=$(ssh humbo@hkremote tar -c /home/humbo/dumps|md5sum)
if test $md5sum == $md5sum_after_rsync
then
    echo "ничего не изменилось"
else
    echo "что-то изменилось"
fi

Вы можете использовать rsync -i. Пустой вывод означает отсутствие изменений.

Или rsync --stats, и парсить вывод …

Запустите rsync -n, вы получите список файлов, которые не синхронизированы:

[alexus@wcmisdlin02 Desktop]$ rsync --help | grep dry-run
 -n, --dry-run               выполнить пробный запуск без внесения изменений
[alexus@wcmisdlin02 Desktop]$ 

Другие ответы полагаются на парсинг/grep вывода, что слишком усложнено.

Ответ Фокса упоминает опцию -i, которая может быть использована вместо этого:

if [ -z "$(rsync -ain /my/source/ /my/target/)" ]
then echo ТОЖЕ САМОЕ
else echo РАЗНЫЕ
fi

Ответ или решение

Конечно! Вот несколько способов, как проверить, синхронизированы ли директории при помощи rsync, и вообще, если ничего не загружается:

1. Использование --stats и grep

Одним из простых методов является использование опции --stats в сочетании с grep для анализа вывода команды. Вот пример команды, которая делает это:

rsync -av --stats --progress humbo@hkremote:/home/humbo/dumps/*.gz . | grep 'Number of files transferred' | awk -F ": " '{print $2}'

Этот подход позволяет получить количество переданных файлов. Если ничего не было передано, вывод будет 0.

2. Использование опции -i

Вы также можете воспользоваться опцией -i, которая выводит информацию о статусе файлов. Если вывод пустой, это означает, что изменений не было:

if [ -z "$(rsync -ai humbo@hkremote:/home/humbo/dumps/*.gz .)" ]; then
    echo "Директории синхронизированы"
else
    echo "Директории не синхронизированы"
fi

3. Проверка результата с помощью md5sum

Если у вас нет проблем с производительностью, вы можете воспользоваться md5sum для создания контрольных сумм архивов перед и после выполнения rsync:

#!/bin/bash
md5sum_before=$(ssh humbo@hkremote tar -c /home/humbo/dumps | md5sum)
rsync -av humbo@hkremote:/home/humbo/dumps/*.gz .
md5sum_after=$(ssh humbo@hkremote tar -c /home/humbo/dumps | md5sum)

if [ "$md5sum_before" == "$md5sum_after" ]; then
    echo "Ничего не изменилось"
else
    echo "Что-то изменилось"
fi

4. Использование режима "сухого запуска"

Можно запустить rsync в режиме "сухого запуска", чтобы увидеть, какие файлы будут скопированы, не выполняя фактические операции. Команда будет выглядеть так:

rsync -avn humbo@hkremote:/home/humbo/dumps/*.gz .

Если вывод будет пустым, это подтверждает, что директории синхронизированы.

Заключение

Вышеуказанные методы позволяют определить, произошли ли изменения в директориях при помощи rsync. Выбор конкретного метода может зависеть от ваших предпочтений и требований к производительности.

Оцените материал
Добавить комментарий

Капча загружается...