
Я хотел бы добавить индикатор выполнения к моей команде резервного копирования 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%. [...]
Единственный способ отобразить индикаторы выполнения для целей резервного копирования, который я могу придумать (помимо компиляции пользовательской версиисмола с баром) является:
Рассчитайте суммарный размер файлов
/media/data
.Создавайте
backup.tar
и добавляйте файлы/media/data
по одному.После каждого файла вычисляйте текущий процент и отображайте его.
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
Осторожность:
- Это, вероятно, замедлит процесс резервного копирования.
- Имена файлов не могут содержать символы новой строки.