Вопрос или проблема
Итак, я уже некоторое время искал и увидел, что rsync предлагает невероятно полезную опцию --info=progress2
(из таких обсуждений, как это), которая красиво отображает общий прогресс обновления. --no-inc-recursive
гарантирует, что прогресс также будет абсолютным.
Теперь одна проблема, с которой я столкнулся, заключается в том, что это перестает работать при задании списка файлов через --from-file
. Файлы передаются без проблем, но прогресс отображается только в самом конце, когда передача уже завершена. Мне кажется, что эта опция просто полностью пропускает этап построения внутреннего дерева файлов и начинает передавать файлы, считанные из списка.
Так что мне интересно, есть ли способ сохранить этот непрерывный прогресс с --from-file
, даже если это означает построение всего списка файлов для передачи, как это было бы в случае рекурсивной передачи.
Ответ или решение
Вопрос, который вы подняли, является интересной и важной темой для системных администраторов и IT-профессионалов, работающих с инструментами синхронизации данных, такими как rsync. Давайте рассмотрим ваш запрос относительно использования параметров --info=progress2
и --from-file
вместе, и как они могут взаимодействовать для отображения прогресса.
Теория
rsync
— это мощный инструмент для копирования и синхронизации файлов и директорий в системах на базе Unix. Он обладает множеством параметров для соответствия различным задачам пользователей. Один из полезных параметров — --info=progress2
, который отображает общий прогресс синхронизации файлов, предоставляя пользователю оценку того, сколько данных уже передано и сколько осталось передать. Это особенно полезно при больших объемах данных, так как позволяет отслеживать процесс в реальном времени.
Параметр --no-inc-recursive
используется для переключения на алгоритм без инкрементальной рекурсии, что позволяет получить более точную оценку общего прогресса. По умолчанию, rsync
использует инкрементальную рекурсию, которая может несколько искажать оценку общего объема.
Теперь перейдем к --from-file
. Этот параметр позволяет указать список файлов, которые должны быть синхронизированы, из файла, что особенно удобно при необходимости передать специфичный набор файлов, а не всю директорию. Однако, как вы отметили, использование --from-file
с --info=progress2
дает не тот ожидаемый результат: общий прогресс показывается лишь по завершению передачи.
Пример
Давайте рассмотрим пример использования:
rsync --info=progress2 --no-inc-recursive --from-file=file_list.txt /source/ /destination/
Этот командный пример пытается корректно отобразить прогресс при использовании файла со списком файлов для передачи. Но на практике, действительно, возникает упомянутая вами ситуация, когда прогресс отображается только в конце.
Применение
Теперь, чтобы решить проблему отображения прогресса в реальном времени при использовании --from-file
, необходимо обойти это ограничение. К сожалению, текущая версия rsync
не предоставляет встроенной возможности для полного отображения --info=progress2
с параметром --from-file
. Это связано с тем, что файл со списком файлов приводит к тому, что rsync
не инициирует предварительное сканирование всего дерева файлов, где можно было бы подсчитать общий объем данных для передачи.
Однако, для получения желаемого визуального результата, предлагаем следующий подход:
-
Предварительное Подсчет: Создайте скрипт, который посчитает общий размер файлов из списка перед запуском
rsync
. Например, с помощью командыdu
или аналогичного инструмента можно рассчитать общий размер данных. -
Альтернативный Способ Отображения Прогресса: Написать обертку на script или bash, чтобы в цикле передавать файлы из списка в
rsync
и самостоятельно суммировать объем данных. -
Разработка Пользовательского Решения: Если подходы выше недостаточны, возможно, вам придется разработать собственное решение на языке программирования, которое будет манипулировать API или использовать инкапсуляцию
rsync
для получения необходимой информации.
Этот процесс может быть оптимизирован за счет создания файла с командой find
, чтобы подсчитать размер всех файлов в листе и затем использовать это значение во время фактической передачи. Например:
total_size=$(awk '{print $1}' <(xargs -d '\n' du -b < file_list.txt) | paste -sd+ - | bc)
После этого будет легче разработать скрипт, который будет выводить прогресс на основе уже известных данных об общем объеме. Для интерактивного отображения просто обновляйте значения по мере завершения передачи каждого файла.
Заключение
Таким образом, проблема отображения прогресса при использовании --from-file
в rsync
может быть частично решена через предварительное вычисление общего объема данных и использования кастомного скрипта для динамического отображения прогресса. Хотелось бы отметить, что рекомендуется следить за обновлениями rsync
, так как такие особенности могут быть улучшены в будущих релизах, и обсуждать возникающие проблемы на соответствующих платформах, возможно, у аналогичных пользователей будут свои подходы к решению.
В заключение, rsync
— это универсальный инструмент, и с помощью определённых модификаций и подготовки, даже такие сложные задачи, как отображение прогресса при работе с файлами из списка, могут быть решены.