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

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

Я запускаю эту команду, чтобы проверить идентичность двух папок и записать все отличия в лог-файл:

rsync -av --delete --checksum --dry-run --stats --itemize-changes --out-format="%t %i %f " SOURCE DESTINATION | tee log.txt

Если между файлами, которые вы сравниваете, нет отличий, rsync не упомянет ничего, кроме этого до окончания работы:

отправка инкрементального списка файлов

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

PS: --info=progress2 не помогло.

[Я вижу, что вы хотите получить список файлов, для которых rsync рассчитывает контрольные суммы, в то время как эти контрольные суммы рассчитываются. Судя по прочитанному, это не доступно. Я приведу более общую информацию ниже о том, как работает отчет rsync в отношении его отчета о ходе выполнения, как я это понимаю.]

Если есть файлы для передачи, то ключ --info=progress1 (“прогресс по файлам”) даст вам некоторую информацию о ходе выполнения. По мере передачи каждого файла он выведет что-то вроде этого:

MD5SUMS.gnome
        141   0%    0.00kB/s    0:00:00 (xfr#1, to-chk=11/13)
ParrotSecurity.lnk
        179   0%   37.11kB/s    0:00:00 (xfr#2, to-chk=10/13)
SHA256SUMS.mate
        486   0%  336.91kB/s    0:00:00 (xfr#3, to-chk=9/13) 
SHA256SUMS.mate.gpg
      1,419   0%    1.22MB/s    0:00:00 (xfr#4, to-chk=8/13)
SHA256SUMS.ubuntu
      1,994   0%    1.77MB/s    0:00:00 (xfr#5, to-chk=7/13)
SHA256SUMS.ubuntu.gpg
      2,927   0%    2.66MB/s    0:00:00 (xfr#6, to-chk=6/13)

xfer показывает, какой файл передается (xfer#6 – это 6-й), а to-chk (например, to-chk=6/13) показывает, что это 6-й из 13.

Обратите внимание, что вы не получите этого в режиме --dry-run, так как нечего передавать. (Вы также можете получить этот вывод с --progress, хотя это неясно из мануала, и я сейчас не буду проверять.)

Если вы ознакомитесь с --recursive в мануале, вы увидите, что с версии 3.0.0 rsync -r проверит несколько каталогов перед началом, а затем продолжит их проверку во время передачи. Это “инкрементальная рекурсивная” проверка, и в этом случае вы увидите ir-chk, а не to-chk. И “знаменатель” в ir-chk может увеличиваться по мере прогрессирующей проверки большего количества файлов.

Если вы не используете --recursive, контрольная сумма рассчитывается сначала, чтобы определить все файлы, которые необходимо передать, а затем они передаются один за другим. Не кажется, что вы можете получить какой-либо вид отчета о ходе выполнения на начальной фазе, когда рассчитываются контрольные суммы, поскольку rsync еще не знает, сколько файлов будет или каковы их размеры. Что касается получения списка имен файлов по мере их контрольной суммы, судя по прочитанному, это не так. (Но может быть и хитрый трюк, и трудно доказать отрицательное!)

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

Чтобы заставить rsync показывать прогресс при сравнении контрольных сумм, даже если различий не обнаружено, необходимо учитывать несколько нюансов работы данной утилиты. Программа, как правило, не предоставляет детализированных отчётов о состоянии на стадии вычисления контрольных сумм в режиме --dry-run. Однако, можно использовать некоторые приемы для получения более информативного вывода.

Варианты решения задачи

  1. Используйте флаг --progress с --dry-run:
    Как уже упоминалось, в режиме --dry-run флаг --progress не дает никаких визуальных индикаторов, так как ничего не передается. Но если вы уберете флаг --dry-run, rsync начнет передавать файлы и предоставит информацию о процессе передачи с помощью --progress.

    rsync -av --delete --checksum --progress SOURCE DESTINATION | tee log.txt

    Однако в этом случае нужно быть осторожным: файлы будут фактически скопированы, если будут отличия. Настоятельно рекомендую использовать данный подход с осторожностью.

  2. Запись перечисления файлов с контрольными суммами в файл:
    Если --dry-run необходим для архивирования или другой обработки, вы можете комбинировать rsync с утилитами find и md5sum для предварительного получения контрольных сумм. Это даст сигнал о том, какие файлы проверяются:

    (cd SOURCE && find . -type f -exec md5sum {} \;) > checksums_source.txt
    (cd DESTINATION && find . -type f -exec md5sum {} \;) > checksums_destination.txt
    diff checksums_source.txt checksums_destination.txt | tee log.txt
  3. Скрипт для отслеживания процесса:
    Вы можете написать скрипт, который будет использовать rsync с флагами и выводить информацию о прогрессе, используя цикл для обработки каждого файла. Например:

    #!/bin/bash
    SOURCE="path_to_source"
    DESTINATION="path_to_destination"
    
    for file in $(find "$SOURCE" -type f); do
       rsync -av --dry-run --checksum "$file" "$DESTINATION/$(basename "$file")"
       echo "Computed checksum for $file"
    done | tee log.txt

    Этот скрипт пройдёт через все файлы в указанной директории и покажет текущее состояние для каждого файла.

Почему это важно

Контроль за процессом при помощи утилиты rsync крайне необходим, особенно когда дело касается больших объёмов данных. Чёткий визуальный отчет о текущем статусе позволяет избежать недоразумений и потенциальных потерь данных. При необходимости можно настроить скрипт так, чтобы он уведомлял пользователя о прогрессе и завершении работы.

Заключение

Хотя стандартные возможности rsync не позволяют отображать прогресс в режиме подсчета контрольных сумм, перечисленные методы позволяют обойти это ограничение. Применяя предложенные варианты, вы сможете достичь желаемого уровня информативности без значительных изменений в своей рабочей процедуре.

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

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