Question Y a-t-il un moyen de voir les progrès du tar par fichier?


J'ai quelques gros fichiers que je voudrais compresser. Je peux le faire avec par exemple

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

Le problème est que je ne peux pas voir de progrès, alors je ne sais pas combien de temps cela prendra ou quelque chose comme ça. En utilisant v Je peux au moins voir à quel moment chaque fichier est terminé, mais lorsque les fichiers sont peu nombreux, cela n'est pas très utile.

Y a-t-il un moyen d'obtenir du goudron pour montrer des progrès plus détaillés? Comme un pourcentage effectué ou une barre de progression ou le temps estimé restant ou quelque chose. Soit pour chaque fichier unique ou tous ou tous les deux.


102
2017-07-28 11:51


origine




Réponses:


Je préfère les oneliners comme ceci:

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

Il aura une sortie comme ceci:

4.69GB 0:04:50 [16.3MB/s] [==========================>        ] 78% ETA 0:01:21

Pour OSX (d'après la réponse de Kenji)

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

74
2017-10-25 08:15



Sur OSX, du ne prend pas l'argument -b, nécessaire pour revenir à: $ ((du -sk / folder-with | awk '{print $ 1}') * 1024)) - ıɾuǝʞ
Nice, un seul paquebot. Pouvez-vous l'expliquer? Ou est-ce que ça marche comme par magie? - Kissaki
Pouvez-vous écrire la commande pour extraire le fichier tar comme ci-dessus? - Krzysztof Szewczyk
Ok, je l'ai pv $FILE.tgz | tar xzf - -C $DEST_DIR - Krzysztof Szewczyk
Pour OS X, je devais utiliser la forme entre crochets pour l'expansion arithmétique, qui faisait: tar cf - /folder-with-big-files -P | pv -s $[$(du -sk /folder-with-big-files | awk '{print $1}') * 1024] | gzip > big-files.tar.gz Sans ce changement, je devenais -bash: syntax error near unexpected token ')' - Dean Becker


Vous pouvez utiliser pv pour y parvenir. Pour signaler la progression correctement, pva besoin de savoir combien d'octets vous lancez. Donc, la première étape consiste à calculer la taille (en kilo-octets). Vous pouvez également supprimer complètement la barre de progression et laisser pv vous dire combien d'octets il a vu; il rapporterait un "fait autant et aussi vite".

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

Et alors:

% tar cvf - folder-with-big-files | pv -p -s ${SIZE}k | \ 
     bzip2 -c > big-files.tar.bz2

70
2017-07-28 12:01



Cool. pv ne semble pas venir avec Mac OS X, mais le fera une fois que j'aurai un ordinateur avec MacPorts. Pouvez-vous expliquer ce que vous faites là-bas? Pas tout à fait sûr de ce que la première ligne fait exactement. - Svish
première ligne: récupère les informations sur le nombre d'octets à traiter. deuxième ligne: utilisez la taille de la première ligne pour permettre à pv de rendre la «progression». Puisque vous transmettez des données, pv ne sait pas combien d’octets supplémentaires seront disponibles. - akira
Un ajout: SIZE=$(($SIZE * 1000 / 1024)) - Je ne sais pas si c'est une bizarrerie sur ma plate-forme, alors je ne l'ajoute pas à la réponse: du renvoie la taille où 1 Ko = 1024 octets, tandis que pv semble s'attendre à 1 Ko = 1000 octets. (Je suis sur Ubuntu 10.04) - Izkata
@lzkata vous pouvez toujours demander du pour utiliser votre taille de bloc préférée, par ex. du -s --block-size=1000, ou juste travailler avec des octets simples, par exemple jeter le kest du du et pv appels. Néanmoins, je m'attendrais tous deux à utiliser 1024 sauf indication contraire, p. ex. la --si allumer du, par exemple. - Legolas
ou déposez simplement les k-stuff et utilisez simplement des octets simples (du -sb et pv -ssans modificateur). cela devrait mettre fin à toute la confusion. - akira


meilleure barre de progression ..

apt-get install pv dialog

(pv -n file.tgz | tar xzf - -C target_directory ) \
2>&1 | dialog --gauge "Extracting file..." 6 50

enter image description here


20
2017-08-28 08:26



Cela fonctionne pour l'extraction, mais vous devez toujours faire l'une des commandes les plus compliquées pour la création (qui était la question d'origine). Il pourrait encore être combiné avec ceux-ci; c'est juste plus compliqué. - Daniel H


Vérifiez --checkpoint et --checkpoint-action options dans la page d'informations sur les tar (comme pour ma distribution, la description de ces options ne figure pas dans la page de manuel → RTFI).

Voir https://www.gnu.org/software/tar/manual/html_section/tar_26.html

Avec ceux-ci (et peut-être la fonctionnalité pour écrire votre propre commande de point de contrôle), vous pouvez calculer un pourcentage ...


10
2017-08-04 20:53



Cela devrait être la bonne réponse. D'autres expliquent simplement des outils supplémentaires (non installés par défaut, d'ailleurs) pour obtenir quelque chose de similaire. - Carmine Giangregorio
@Sardathrion Peut-être parce que c'est GNU-tar spécifique. - phk


Inspiré par réponse de l'aide

Une autre façon est d'utiliser le natif tar options

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 "]"

le résultat est comme

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

un exemple complet ici


5
2017-07-16 00:22





Juste remarqué le commentaire sur MacOS, et alors que je pense que la solution de @akira (et pv) est beaucoup plus précis je pensais que je poursuivrais une intuition et une rapide mise en forme dans ma boîte MacOS avec tar et lui envoyais un signal SIGINFO. Curieusement, cela a fonctionné :) si vous êtes sur un système de type BSD, cette devrait travailler, mais sur une machine Linux, vous devrez peut-être envoyer un SIGUSR1, et / ou tar pourrait ne pas fonctionner de la même manière.

L'inconvénient est qu'il ne vous fournira qu'une sortie (sur la sortie standard) vous indiquant à quelle distance il se trouve dans le fichier actuel, car je suppose qu'il n'a aucune idée de la taille du flux de données qu'il reçoit.

Donc, oui, une autre approche serait de lancer tar et de lui envoyer périodiquement des SIGINFO chaque fois que vous voulez savoir jusqu'où il est arrivé. Comment faire cela?

L'approche ad hoc manuelle

Si vous souhaitez être en mesure de vérifier l’état sur une base ad hoc, vous pouvez control-T (comme Brian Swift l'a mentionné) dans la fenêtre correspondante qui enverra le signal SIGINFO. Un problème avec cela, c’est qu’il l’enverra à toute la chaîne, je crois, donc si vous faites:

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

Vous verrez également bzip2 signaler son statut avec 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)

Cela fonctionne bien si vous voulez juste vérifier si cela tar vous courez est bloqué, ou juste lent. Vous n'avez probablement pas besoin de trop vous soucier des problèmes de formatage dans ce cas, car il ne s'agit que d'une vérification rapide.

Le type d'approche automatisée

Si vous savez que cela va prendre un certain temps, mais que vous voulez quelque chose comme un indicateur de progression, une alternative serait de déclencher votre processus tar et d’exécuter son PID sur un autre terminal, puis de le lancer dans un script . Par exemple, si vous avez le scriptlet suivant (et invoquez-le comme dit 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?"

Si vous l'invoquez de cette façon, puisque vous ne ciblez que tar vous aurez une sortie plus comme ça

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)
...

ce que j'avoue, c'est plutôt joli.

Last but not least - mon script est un peu rouillé, alors si quelqu'un veut aller nettoyer / corriger / améliorer le code, allez-y :)


2
2018-04-21 20:44



Si en cours d'exécution tar sur la ligne de commande, en tapant control-T lui enverra un SIGINFO. Si c'était dans un script, cela se ferait avec kill -INFO pid - Brian Swift
Complètement oublié control-T, J'ai clairement pris l'habitude de spammer trop de fenêtres de console pour mon propre bien. - tanantish
pourquoi je ne peux pas voir -SIGINFO en faisant kill -l - Felipe Alvarez


Inspiré par La réponse de Noah Spurrier

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
}

La source


2
2018-04-18 01:00



Un peu de contexte et d'explication peut-être? - Kissaki


Si vous connaissiez le numéro de fichier au lieu de la taille totale de tous:

une alternative (moins précise mais appropriée) consiste à utiliser l'option -l et à envoyer dans le canal unix les noms de fichiers au lieu du contenu de données.

Avons 12345 fichiers dans mydir, commande est:

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

vous pouvez connaître cette valeur à l'avance (en raison de votre cas d'utilisation) ou utiliser une commande comme trouver + wc pour le découvrir:

[myhost@myuser mydir]$ find | wc -l
12345

1
2017-09-15 12:38



Alors, pourquoi ne pas mettre cette commande en sous-commande? =) - Kirby
tar cfvz ~/mytarfile.tgz . | pv -s $(find . | wc -l) -l > /dev/null. Est-ce que ça marche pour toi? - Kirby


Méthode basée sur tqdm:

tar -v -xf tarfile.tar -C TARGET_DIR | tqdm --total $(tar -tvf tarfile.tar | wc -l) > /dev/null

0
2018-04-27 06:44





Utiliser uniquement du goudron

tar a la possibilité (depuis la v1.12) d’imprimer des informations de statut sur les signaux en utilisant --totals=$SIGNO, par exemple.:

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

le Total bytes written: [...] les informations sont imprimées sur chaque signal USR1, par exemple:

pkill -SIGUSR1 tar

La source:


0
2018-06-15 05:03