Вопрос или проблема
Есть ли способ узнать из 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-скрипте, чтобы определить, что не было скопировано ни одного файла.
Никогда этого не делал, но это может сработать, если ваши директории не слишком большие.
Создайте 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
. Выбор конкретного метода может зависеть от ваших предпочтений и требований к производительности.