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

<p>у меня есть пара больших файлов, которые я хотел бы сжать. я могу сделать это, например, с</p><pre><code>tar cvfj big-files.tar.bz2 folder-with-big-files </code></pre><p>проблема в том, что я не вижу никакого прогресса, поэтому я понятия не имею, сколько времени это займет или что-то в этом роде. используя <code>v</code>, я могу, по крайней мере, видеть, когда каждый файл завершен, но когда файлов мало и они большие, это не самое полезное.</p><p>есть ли способ получить tar, чтобы показать более детальный прогресс? например, процент выполнения или индикатор выполнения или оставшееся время или что-то еще. либо для каждого отдельного файла, либо для всех, либо для обоих.</p>

<p>я предпочитаю oneliners, как это:</p><pre><code>tar cf - /folder-with-big-files -p | pv -s $(du -sb /folder-with-big-files | awk '{print $1}') | gzip > big-files.tar.gz </code></pre><p>это будет иметь следующий результат:</p><pre><code>4.69gb 0:04:50 [16.3mb/s] [==========================> ] 78% eta 0:01:21 </code></pre><p><strong> для osx </strong>(из ответа кендзи)</p><pre><code>tar cf - /folder-with-big-files -p | pv -s $(($(du -sk /folder-with-big-files | awk '{print $1}')  1024)) | gzip > big-files.tar.gz 

вы можете использовать <a href="http://www.ivarch.com/programs/pv.shtml">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 </code></pre>

<p>лучше прогресс бар ..</p><pre><code>apt-get install pv dialog (pv -n file.tgz | tar xzf - -c target\_directory ) \ 2>&1 | dialog --gauge "extracting file..." 6 50 </code></pre><p><img src="https://i.stack.imgur.com/rhijb.png" alt="enter image description here"></p>

<p>проверьте параметры <code>--checkpoint</code> и <code>--checkpoint-action</code> на странице информации о tar (что касается моего дистрибутива, описание этих параметров не содержится на странице man → rtfi).</p><p>см. <a href="https://www.gnu.org/software/tar/manual/html\_section/tar\_26.html">https://www.gnu.org/software/tar/manual/html\_section/tar\_26.html</a> </p><p>с их помощью (и, возможно, с функциональностью, чтобы написать свою собственную команду контрольной точки), вы можете рассчитать процент ...</p>

<p>вдохновленный <a href="https://superuser.com/a/319207/726186">ответом помощника</a> </p><p>другой способ - использовать нативные опции <code>tar</code></p><pre><code>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: [>>>>>>>>>>>>>>>>>>>>>>> полный пример <a href="http://www.campisano.org/wiki/en/script_bkp.sh">здесь 

просто заметил комментарий о macos, и хотя я думаю, что решение от @akira (и pv) - это много аккуратнее, я подумал, что я поймал догадку и быструю игру в моей коробке macos с tar и отправил бы ей siginfo сигнал. как ни странно, это сработало :), если вы работаете в bsd-подобной системе, это должно работать, но на linux-коробке вам может понадобиться отправить sigusr1, и/или tar может работать не так ,.недостатком является то, что он предоставит вам только вывод (на стандартный вывод), показывающий, как далеко находится текущий файл, так как я предполагаю, что он понятия не имеет, насколько велик поток данных, который он получает.так что да, альтернативный подход - запускать tar и периодически отправлять 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?" </code></pre><p>если вы вызываете его таким образом, поскольку вы нацеливаетесь только на <code>tar</code>, вы получите более похожий результат</p><pre><code>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) ... </code></pre><p>что я признаю, это довольно мило.</p><p>и последнее, но не менее важное - мои скрипты довольно ржавые, поэтому, если кто-то захочет пойти и почистить/исправить/улучшить код, продолжайте свою жизнь :)</p>

<p><strong> использование только tar </strong></p><p><code>tar</code> имеет опцию (начиная с v1.12) для печати информации о состоянии сигналов, используя <code>--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 источник:  <a href="https://www.gnu.org/software/tar/manual/html_section/tar_25.html">gnu.org - gnu tar - 3.7 проверка прогресса tar   <a href="http://cvs.savannah.gnu.org/viewvc/checkout/tar/tar/news">gnu.org - tar - новости  

вдохновленный <a href="https://stackoverflow.com/a/3554912">ответ ноа спурриера <pre class="lang-sh prettyprint-override">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 } </code></pre><p> <a href="http://github.com/svnpenn/dotfiles/blob/54f487f/.bashrc#l50-l63">источник</a> </p>

<p><strong> если вы знаете номер файла вместо общего размера всех из них: </strong></p><p>альтернатива (менее точная, но подходящая) заключается в использовании опции -l и отправке в канале unix имен файлов вместо содержимого данных.</p><p>давайте поместим 12345 файлов в<em> mydir </em>, команда:</p><pre><code>[myhost@myuser mydir]$ tar cfvz ~/mytarfile.tgz .|pv -s 12345 -l > /dev/null вы можете знать это значение заранее (из-за вашего варианта использования) или использовать какую-то команду, например find + wc , чтобы обнаружить это:[myhost@myuser mydir]$ find | wc -l 12345 </code></pre>

<p>метод основан на <a href="https://github.com/tqdm/tqdm#usage">tqdm</a> :</p><pre><code>tar -v -xf tarfile.tar -c target\_dir | tqdm --total $(tar -tvf tarfile.tar | wc -l) > /dev/null </code></pre>