2010-07-28 11:51:37 +0000 2010-07-28 11:51:37 +0000
133
133

Есть ли способ увидеть прогресс по каждому файлу?

У меня есть пара больших файлов, которые я хотел бы сжать. Я могу сделать это, например, с

tar cvfj big-files.tar.bz2 folder-with-big-files

Проблема в том, что я не вижу никакого прогресса, так что я понятия не имею, сколько времени это займет или что-то в этом роде. Используя v, я, по крайней мере, вижу, когда каждый файл завершен, но когда файлов мало и много, это не самое полезное.

Есть ли способ получить tar, чтобы показать более детальный прогресс? Например, процент выполненных файлов, шкала прогресса или примерное оставшееся время или что-то в этом роде. Или для каждого файла, или для всех файлов, или для обоих.

Ответы (13)

109
109
109
2013-10-25 08:15:15 +0000

Я предпочитаю такие однополые:

tar cf - /folder-with-big-files -P | pv -s $(du -sb /folder-with-big-files | awk '{print $1}') | gzip > big-files.tar.gz

У него будет такой вывод: 0x2 и 0x2 и 0x1 и 0x2 и 0x2 и Для OSX (из ответа Kenji) 0x2 и 0x2 и 0x1 и 0x1 и

77
77
77
2010-07-28 12:01:07 +0000

Вы можете использовать pv для этого. Чтобы правильно сообщить о прогрессе, pv необходимо знать, сколько байт вы выбрасываете на него. Итак, первый шаг - это вычислить размер (в килобайтах). Вы также можете полностью сбросить индикатор прогресса и просто дать pv сказать вам, сколько байт он видел; он сообщит о “сделано так много и так быстро”.

% SIZE=`du -sk folder-with-big-files | cut -f 1`

И потом:

% tar cvf - folder-with-big-files | pv -p -s ${SIZE}k | \ 
     bzip2 -c > big-files.tar.bz2
23
23
23
2012-08-28 08:26:14 +0000

b

17
17
17
2011-08-04 20:53:06 +0000

Ознакомьтесь с опциями --checkpoint и --checkpoint-action на странице tar info (что касается моего дистрибутива, описание этих опций не содержится в man-странице → RTFI).

Смотрите _COPY12_section/tar_26.html

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

11
11
11
2017-07-16 00:22:25 +0000

Вдохновленный ответ помощника

Другой способ - использовать родные tar опции

FROMSIZE=`du -sk ${FROMPATH} | cut -f 1`;
CHECKPOINT=`echo ${FROMSIZE}/50 | bc`;
echo "Estimated: [==================================================]";
echo -n "Progess: [";
tar -c --record-size=1K --checkpoint="${CHECKPOINT}" --checkpoint-action="ttyout=>" -f - "${FROMPATH}" | bzip2 > "${TOFILE}";
echo "]"

Результат как

Estimated: [==================================================]
Progess: [>>>>>>>>>>>>>>>>>>>>>>>

Полный пример здесь

8
8
8
2018-06-15 05:03:41 +0000

Использование только tar

tar имеет возможность (начиная с версии 1.12) распечатывать информацию о состоянии сигналов с помощью --totals=$SIGNO, например:

tar --totals=USR1 -czf output.tar input.file
Total bytes written: 6005319680 (5.6GiB, 23MiB/s)

Информация Total bytes written: [...] печатается по каждому сигналу USR1, например:

pkill -SIGUSR1 tar

Источник:

3
3
3
2012-04-21 20:44:39 +0000

Просто заметил комментарий о MacOS, и в то время как я думаю, что решение от @akira (и pv) является much аккуратнее я думал, что я буду гоняться за догадкой и быстрое воспроизведение в моем MacOS окне с смолой и посылая ему сигнал SIGINFO. Забавно, но это сработало :) если Вы на BSD-подобной системе, это should работает, но на Linux-боксе, Вам может понадобиться послать SIGUSR1, и/или tar может работать не так, как раньше.

Отрицательным моментом является то, что он выдает только вывод (на stdout), показывающий, как далеко он прошел через текущий файл, так как я полагаю, что он не имеет представления о том, какой большой поток данных он получает.

Так что да, альтернативным подходом будет зажигание смолы и периодическая отправка ей SIGINFO в любое время, когда вы захотите узнать, как далеко она зашла. Как это сделать?

Рекламный, ручной подход

Если вы хотите иметь возможность проверять состояние на специальной основе, вы можете нажать control-T (как упомянул Брайан Свифт) в соответствующем окне, которое будет посылать сигнал SIGINFO. Одной из проблем является то, что он будет посылать его на всю вашу цепочку, я полагаю, так что если вы делаете:

% tar cvf - folder-with-big-files | bzip2 -c > big-files.tar.bz2

Вы также увидите отчет bzip2 вместе с tar:

a folder-with-big-files/big-file.imgload 0.79 cmd: bzip2 13325 running 
      14 0.27u 1.02s 

      adding folder-with-big-files/big-file.imgload (17760256 / 32311520)

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

Своего рода автоматический подход

Если вы знаете, что это займет некоторое время, но хотите что-то вроде индикатора прогресса, альтернативой было бы запустить процесс tar и в другом терминале разобраться, что это PID, а затем бросить его в скрипт, который просто многократно посылает сигнал. Например, если у вас есть следующий скриптлет (и вы вызываете его, как скажем, script.sh PID-to-signal interval-to-signal-at):

#!/bin/sh

PID=$1
INTERVAL=$2
SIGNAL=29 # excuse the voodoo, bash gets the translation of SIGINFO, 
               # sh won't..

kill -0 $PID # invoke a quick check to see if the PID is present AND that
               # you can access it..

echo "this process is $$, sending signal $SIGNAL to $PID every $INTERVAL s"
while [$? -eq 0]; do
     sleep $INTERVAL;
     kill -$SIGNAL $PID; # The kill signalling must be the last statement
                            # or else the $? conditional test won't work
done
echo "PID $PID no longer accessible, tar finished?"

Если вы вызываете его таким образом, так как вы нацеливаетесь только на tar, вы получите результат, более похожий на этот

a folder-with-big-files/tinyfile.1
a folder-with-big-files/tinyfile.2
a folder-with-big-files/tinyfile.3
a folder-with-big-files/bigfile.1
adding folder-with-big-files/bigfile.1 (124612 / 94377241)
adding folder-with-big-files/bigfile.1 (723612 / 94377241)
...

, который, я признаю, вроде как хорош.

И последнее, но не менее важное - мой скриптинг вроде как ржавый, так что если кто-то хочет войти и почистить/ исправить/улучшить код, идите за свою жизнь :)

2
2
2
2012-04-18 01:00:19 +0000

Вдохновленный Ответ Ноа Сперьера

function tar {
  local bf so
  so=${*: -1}
  case $(file "$so" | awk '{print$2}') in
  XZ) bf=$(xz -lv "$so" |
    perl -MPOSIX -ane '$.==11 && print ceil $F[5]/50688') ;;
  gzip) bf=$(gzip -l "$so" |
    perl -MPOSIX -ane '$.==2 && print ceil $F[1]/50688') ;;
  directory) bf=$(find "$so" -type f | xargs du -B512 --apparent-size |
    perl -MPOSIX -ane '$bk += $F[0]+1; END {print ceil $bk/100}') ;;
  esac
  command tar "$@" --blocking-factor=$bf \
    --checkpoint-action='ttyout=%u%\r' --checkpoint=1
}

Источник

1
1
1
2017-09-15 12:38:27 +0000

Если вы знаете номер файла, а не общий размер всех файлов:

Альтернативой (менее точной, но подходящей) является использование опции -l и отправка в unix-трубе имен файлов, а не содержимого данных.

Давайте 12345 файлов в mydir, команда такова:

[myhost@myuser mydir]$ tar cfvz ~/mytarfile.tgz .|pv -s 12345 -l > /dev/null

вы можете знать такое значение заранее (из-за вашего варианта использования) или использовать какую-нибудь команду типа find+wc, чтобы обнаружить его:

[myhost@myuser mydir]$ find | wc -l
12345
1
1
1
2019-09-02 20:05:09 +0000

На macOS, сначала убедитесь, что у вас есть все доступные команды, и установите недостающие (например, pv), используя brew .

Если вы хотите установить только tar ** без компрессии** , продолжайте:

tar -c folder-with-big-files | pv -s $[$(du -sk folder-with-big-files | awk '{print $1}') * 1024] > folder-with-big-files.tar

Если вы хотите компрессировать , вперед:

tar cf - folder-with-big-files -P | pv -s $[$(du -sk folder-with-big-files | awk '{print $1}') * 1024] | gzip > folder-with-big-files.tar.gz

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

1
1
1
2018-04-27 06:44:10 +0000

Метод, основанный на tqdm :

tar -v -xf tarfile.tar -C TARGET_DIR | tqdm --total $(tar -tvf tarfile.tar | wc -l) > /dev/null
0
0
0
2019-09-13 15:39:11 +0000

Вот некоторые цифры резервного копирования prometheus (метрических данных) в Debian/buster AMD64:

root# cd /path/to/prometheus/
root# tar -cf - ./metrics | ( pv -p --timer --rate --bytes > prometheus-metrics.tar )

Отмена этой работы, так как не было достаточно свободного места на диске.

Экспериментируя с zstd в качестве компрессора для tar с мониторингом прогресса с использованием pv:

root# apt-get update
root# apt-get install zstd pv

root# tar -c --zstd -f - ./metrics | ( pv -p --timer --rate --bytes > prometheus-metrics.tar.zst )
10.2GiB 0:11:50 [14.7MiB/s]

root# du -s -h prometheus
62G prometheus

root# du -s -h prometheus-metrics.tar.zst
11G prometheus-metrics.tar.zst
0
0
0
2020-02-25 22:54:21 +0000

В моем ежедневном использовании мне не нужно знать точный процентный прогресс операции, только если она работает и (иногда) насколько она близка к завершению.

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

let n=0; tar zcvf files.tgz directory | while read LINE; do printf "\r%d" $((n++)) ; done ; echo

Так как я часто этим пользуюсь, я определил псевдоним функции в . bashrc:

function pvl { declare -i n=0; while read L ; do printf "\r%d" $((++n)) ; done ; echo ; }

Тогда просто:

tar zcvf files.tgz directory | pvl

Я могу вычислить количество файлов заранее, если нужно, с помощью find directory | wc -l (Или лучше использовать ту же самую функцию, показанную [find directory | pvl], чтобы раздавить мое нетерпение!)

Другой пример, установка прав для виртуального сайта (после этого, chown -R быстрая, потому что имена файлов находятся в кэше файловой системы):

find /site -print -type d -exec chmod 2750 "{}" \; -o -type f -exec chmod 640 "{}" | pvl

Правда, эта латеральная обработка может замедлить основную операцию, но я думаю, что печать символа возврата и нескольких цифр не может быть слишком дорогой (кроме того, ожидание появления следующего знака равенства или смены цифры в процентах кажется медленным по сравнению с субъективной молниеносной скоростью смены цифр!)

Похожие вопросы

10
37
7
14
4