it-swarm.com.de

Gibt es eine Möglichkeit, den Teerfortschritt pro Datei zu sehen?

Ich habe ein paar große Dateien, die ich komprimieren möchte. Ich kann das zum Beispiel mit machen

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

Das Problem ist, dass ich keinen Fortschritt sehe, also habe ich keine Ahnung, wie lange es dauern wird oder so. Mit v kann ich zumindest sehen, wann jede Datei fertig ist, aber wenn die Dateien klein und groß sind, ist dies nicht besonders hilfreich.

Gibt es eine Möglichkeit, wie ich Teer dazu bringen kann, detailliertere Fortschritte zu zeigen? Wie ein erledigter Prozentsatz oder ein Fortschrittsbalken oder eine geschätzte verbleibende Zeit oder so etwas. Entweder für jede einzelne Datei oder für alle oder für beide.

117
Svish

Ich bevorzuge Oneliner wie folgt:

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

Die Ausgabe wird folgendermaßen aussehen:

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

Für OSX (aus Kenjis Antwort)

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

Sie können pv verwenden, um dies zu erreichen. Um den Fortschritt korrekt zu melden, muss pv wissen, wie viele Bytes Sie darauf werfen. Der erste Schritt ist also die Berechnung der Größe (in KB). Sie können den Fortschrittsbalken auch vollständig löschen und sich von pv anzeigen lassen, wie viele Bytes es gesehen hat. es würde ein "so viel und so schnell getan" melden.

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

Und dann:

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

bessere Fortschrittsanzeige ..

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

22
Mr. Black

Überprüfen Sie die Optionen --checkpoint und --checkpoint-action auf der Tar-Infoseite (für meine Distribution ist die Beschreibung für diese Optionen nicht in der Manpage → RTFI enthalten).

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

Mit diesen (und möglicherweise der Funktionalität zum Schreiben eines eigenen Prüfpunktbefehls) können Sie einen Prozentsatz berechnen ...

15
helper

Inspiriert von der Antwort des Helfers

Eine andere Möglichkeit ist die Verwendung der nativen Optionen 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 "]"

das Ergebnis ist wie

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

ein komplettes Beispiel hier

8
campisano

Ich habe gerade den Kommentar zu MacOS bemerkt, und obwohl ich denke, dass die Lösung von @akira (und pv) much netter ist, dachte ich, ich würde eine Ahnung und eine schnelle Umgehung in meiner MacOS-Box mit tar verfolgen und es senden ein SIGINFO-Signal. Witzigerweise hat es funktioniert :) Wenn Sie auf einem BSD-ähnlichen System arbeiten, sollte diesesfunktionieren, aber auf einer Linux-Box müssen Sie möglicherweise ein SIGUSR1 senden, und/oder tar funktioniert möglicherweise nicht gleicher Weg.

Der Nachteil ist, dass Sie nur eine Ausgabe (auf stdout) erhalten, die zeigt, wie weit die aktuelle Datei reicht, da ich vermute, dass sie keine Ahnung davon hat, wie groß der Datenstrom ist, den sie erhält.

Also ja, ein alternativer Ansatz wäre, Teer anzuzünden und ihm regelmäßig SIGINFOs zu senden, wann immer Sie wissen möchten, wie weit es gekommen ist. Wie macht man das?

Der manuelle Ad-hoc-Ansatz

Wenn Sie in der Lage sein möchten, den Status ad-hoc zu überprüfen, können Sie im entsprechenden Fenster control-T (wie von Brian Swift erwähnt) drücken, um das SIGINFO-Signal weiterzuleiten. Ein Problem dabei ist, dass es meiner Meinung nach an Ihre gesamte Kette gesendet wird. Wenn Sie also Folgendes tun:

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

Sie werden auch sehen, dass bzip2 seinen Status zusammen mit tar meldet:

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)

Dies funktioniert sehr gut, wenn Sie nur überprüfen möchten, ob die von Ihnen ausgeführte tar feststeckt oder nur langsam ist. In diesem Fall müssen Sie sich wahrscheinlich nicht zu viele Gedanken über Formatierungsprobleme machen, da es sich nur um eine schnelle Überprüfung handelt.

Die Art des automatisierten Ansatzes

Wenn Sie wissen, dass es eine Weile dauern wird, Sie aber eine Art Fortschrittsanzeige benötigen, können Sie alternativ Ihren Teerprozess abfeuern und in einem anderen Terminal die PID ermitteln und dann in ein Skript schreiben, das nur wiederholt ein Signal sendet . Wenn Sie beispielsweise das folgende Scriptlet haben (und es als say script.sh PID-to-signal interval-to-signal-at aufrufen):

#!/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?"

Wenn Sie es auf diese Weise aufrufen, erhalten Sie eine Ausgabe wie diese, da Sie nur auf tar zielen

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

was ich zugebe, ist irgendwie hübsch.

Last but not least - mein Scripting ist ein bisschen verrostet. Wenn also jemand den Code bereinigen, reparieren oder verbessern möchte, dann ist alles in Ordnung :)

3
tanantish

Nur Teer verwenden

tar hat die Option (seit v1.12), Statusinformationen auf Signalen unter Verwendung von --totals=$SIGNO auszudrucken, z.

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

Die Total bytes written: [...]-Informationen werden auf jedes USR1-Signal gedruckt, z.

pkill -SIGUSR1 tar

Quelle:

2
Murmel

Inspiriert von Noah Spurriers Antwort

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 "[email protected]" --blocking-factor=$bf \
    --checkpoint-action='ttyout=%u%\r' --checkpoint=1
}

Quelle

2
Steven Penny

Wenn Sie die Dateinummer anstelle der Gesamtgröße aller von ihnen bekannt:

eine Alternative (weniger genau, aber geeignet) ist die Verwendung der Option -l und das Senden der Dateinamen anstelle des Dateninhalts in der Unix-Pipe.

Wir haben 12345 Dateien in mydir , der Befehl lautet:

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

sie können diesen Wert (aufgrund Ihres Anwendungsfalls) im Voraus kennen oder einen Befehl wie find + wc verwenden, um ihn zu ermitteln:

[[email protected] mydir]$ find | wc -l
12345
1
bzimage

Methode basiert auf tqdm :

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