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

Y a-t-il un moyen de voir la progression du goudron par dossier ?

J'ai quelques gros fichiers que j'aimerais comprimer. Je peux le faire avec par exemple

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

Le problème est que je ne vois aucun progrès, donc je n'ai aucune idée du temps que cela prendra ou quelque chose comme ça. En utilisant v je peux au moins voir quand chaque fichier est terminé, mais quand les fichiers sont peu nombreux et volumineux, ce n'est pas le plus utile.

Y a-t-il un moyen d'obtenir du goudron pour montrer plus en détail les progrès réalisés ? Par exemple, un pourcentage de travail effectué, une barre de progression ou une estimation du temps restant. Soit pour chaque fichier, soit pour tous les fichiers, soit pour les deux.

Réponses (12)

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

Je préfère les onliners comme celui-ci :

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 celle-ci :

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
77
77
77
2010-07-28 12:01:07 +0000

Vous pouvez utiliser pv pour y parvenir. Pour rendre compte correctement de la progression, pv doit savoir combien d'octets vous lui lancez. La première étape consiste donc à calculer la taille (en koctets). Vous pouvez également supprimer complètement la barre de progression et laisser pv vous dire combien d'octets il a vu ; cela indiquerait “fait autant et aussi vite”.

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

Et puis :

% 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

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

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

Consultez les options --checkpoint et --checkpoint-action dans la page tar info (comme pour ma distribution, la description de ces options n'est pas contenue dans la page man → RTFI).

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

Avec ces options (et peut-être la fonctionnalité permettant d'écrire votre propre commande de point de contrôle), vous pouvez calculer un pourcentage…

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

Inspiré par réponse de l'aide

Une autre façon est d'utiliser les options 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 "]"

le résultat est comme

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

un exemple complet ici

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

En utilisant uniquement le goudron

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

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

L'information Total bytes written: [...] est imprimée sur chaque signal USR1, par exemple

pkill -SIGUSR1 tar

Source :

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

Je viens de remarquer le commentaire sur MacOS, et bien que je pense que la solution de @akira (et pv) est complètement plus propre, j'ai pensé que je pourrais suivre une intuition et une rapide mise au point dans ma boîte MacOS avec du goudron et lui envoyer un signal SIGINFO. Curieusement, ça a marché :) si vous êtes sur un système de type BSD, cela devrait fonctionner, mais sur une machine Linux, vous pourriez avoir besoin d'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 stdout) vous montrant à quelle distance se trouve 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 approche alternative serait d'allumer le goudron et de lui envoyer périodiquement des SIGINFOs chaque fois que vous voulez savoir jusqu'où il est arrivé. Comment faire ?

L'approche manuelle ad hoc

Si vous voulez être en mesure de vérifier le statut de manière ad hoc, vous pouvez appuyer sur control-T (comme Brian Swift l'a mentionné) dans la fenêtre correspondante qui enverra le signal SIGINFO. Le problème, c'est que cela va l'envoyer à toute votre chaîne, je crois, donc si vous le faites :

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

Vous verrez également bzip2 signaler son statut avec le goudron :

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 le tar que vous exécutez est bloqué, ou juste lent. Dans ce cas, vous n'avez probablement pas à vous soucier de problèmes de formatage, puisqu'il ne s'agit que d'une vérification rapide..

Le genre d'approche automatisée

Si vous savez que cela va prendre un certain temps, mais que vous voulez quelque chose comme un indicateur de progrès, une alternative serait de lancer votre processus de goudron et dans un autre terminal, de calculer son PID et de le lancer dans un script qui envoie un signal répété. Par exemple, si vous avez le scriptlet suivant (et que vous l'invoquez en disant 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 visez que tar vous obtiendrez une sortie plus semblable à celle-ci

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

qui, je l'admets, est plutôt jolie.

Enfin et surtout, mon script est un peu rouillé, donc si quelqu'un veut aller nettoyer/réparer/améliorer le code, allez-y pour votre vie :)

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

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
}

Source [ Source

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

Méthode basée sur tqdm :

tar -v -xf tarfile.tar -C TARGET_DIR | tqdm --total $(tar -tvf tarfile.tar | wc -l) > /dev/null
1
1
1
2019-09-02 20:05:09 +0000

Sur macOS, assurez-vous d'abord que vous avez toutes les commandes disponibles, et installez celles qui manquent (par exemple pv) en utilisant brew .

Si vous voulez seulement tar sans compression , utilisez :

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

Si vous voulez compresser , utilisez :

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

Note : Il peut s'écouler un certain temps avant que la barre de progression n'apparaisse. Essayez d'abord un petit dossier pour vous assurer qu'il fonctionne, puis passez au dossier-avec-gros fichiers.

0
0
0
2020-02-25 22:54:21 +0000

Dans mon utilisation quotidienne, je n'ai pas besoin de connaître le pourcentage exact de l'avancement de l'opération, seulement si elle fonctionne et (parfois) dans quelle mesure elle est proche de son terme.

Je résous ce besoin au minimum en affichant le nombre de fichiers traités dans sa propre ligne ; en Bash :

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

Comme j'utilise beaucoup cette fonction, j'ai défini un alias de fonction dans . bashrc :

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

Puis simplement :

tar zcvf files.tgz directory | pvl

Je peux calculer le nombre de fichiers à l'avance si nécessaire avec find directory | wc -l (Ou mieux en utilisant la même fonction affichée [find directory | pvl] pour écraser mon impatience !)

Un autre exemple, la définition des droits pour un site web virtuel (après cela, un chown -R est rapide car les noms de fichiers sont dans le cache du système de fichiers) :

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

C'est vrai que ce traitement latéral pourrait ralentir l'opération principale, mais je pense que l'impression d'un caractère de retour et de quelques chiffres ne peut pas être trop coûteuse (en outre, attendre le prochain signe égal ou le prochain pourcentage de changement de chiffre semble lent par rapport à la vitesse subjective de changement des chiffres !)

0
0
0
2019-09-13 15:39:11 +0000

Voici quelques chiffres d'une sauvegarde Prometheus (données métriques) sur Debian/buster AMD64 :

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

Annulé ce travail car il n'y avait pas assez d'espace disque disponible.

Expérimenter avec zstd comme compresseur pour tar avec suivi de la progression en utilisant 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