Резервное копирование Tar с индикатором выполнения

Резервное копирование Tar с индикатором выполнения

Я хотел бы добавить индикатор выполнения к моей команде резервного копирования tar. Я обнаружил, чтобарСкрипт оболочки должен уметь это делать, но я не могу придумать правильную команду.

sudo tar pzcf - /media/data | bar > /media/backups/backup.tar.gz

С помощью указанной выше команды мне удалось отобразить некоторую информацию, но пока без индикатора выполнения.

решение1

Извините, но это невозможно. Из barсамого файла:

Synopsis:
  'bar' works just like 'cat', but shows a progress bar in ASCII art on stderr.
  The script's main function is meant to be usable in any Bourne shell to be
  suitable for install scripts without the need for any additional tool.

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

Дляизвлечениеархив, это не проблема: если backup.tarбольшой 100 MiBи 50 MiBуже обработан, то мы находимся в 50 %.

Однако, длясозданиеархив, barчитает из stdin, который бесконечен для всех практических целей. Какдокументацияговорит:

Бесконечные потоки неприятны: полоса отображается только при 0% и 100%. [...]


Единственный способ отобразить индикаторы выполнения для целей резервного копирования, который я могу придумать (помимо компиляции пользовательской версиисмола с баром) является:

  1. Рассчитайте суммарный размер файлов /media/data.

  2. Создавайте backup.tarи добавляйте файлы /media/dataпо одному.

  3. После каждого файла вычисляйте текущий процент и отображайте его.

  4. gzip backup.tar(выможетиспользуйте tarдля этого).

Пример:

TOTAL=$(du -b /media/data | grep -oP "^\d+")
CURRENT=0
echo "Archiving:"
IFS="
"
for FILE in $(find /media/data -type f); do 
    tar rf backup.tar $FILE
    CURRENT=$(($CURRENT+$(du -b $FILE | grep -oP "^\d+")))
    echo -en "\r"$((100*($CURRENT-1)/$TOTAL+1))"%"
done
echo
echo "Compressing:"
bar backup.tar | gzip > backup.tar.gz
rm backup.tar

Осторожность:

  • Это, вероятно, замедлит процесс резервного копирования.
  • Имена файлов не могут содержать символы новой строки.

Связанный контент