Gibt es eine Möglichkeit, den Fortschritt der Teer pro Datei zu sehen?

99296
Svish

Ich habe ein paar große Dateien, die ich gerne 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 keine Fortschritte sehen kann, daher habe ich keine Ahnung, wie lange es dauern wird oder ähnliches. Unter Verwendung vIch kann zumindest sehen, wenn jede Datei abgeschlossen ist, aber wenn die Dateien sind nur wenige und große dies ist nicht das sehr hilfreich.

Gibt es eine Möglichkeit, wie Sie mit tar einen detaillierteren Fortschritt anzeigen können? Wie ein Prozentsatz oder ein Fortschrittsbalken oder die geschätzte verbleibende Zeit oder etwas. Entweder für jede einzelne Datei oder alle oder beide.

105

10 Antworten auf die Frage

79
checksum

Ich bevorzuge Oneliner wie diese:

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

Es wird wie folgt ausgegeben:

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 '') * 1024)) | gzip > big-files.tar.gz 
On OSX, du does not take -b argument, needed to fallback to : $((du -sk /folder-with | awk '') * 1024)) ıɾuǝʞ vor 10 Jahren 2
Schön, ein One-Liner. Kannst du es erklären? Oder funktioniert es einfach magisch? Kissaki vor 9 Jahren 4
Können Sie einen Befehl zum Extrahieren der tar-Datei wie oben beschrieben schreiben? Krzysztof Szewczyk vor 9 Jahren 0
Ok, ich habe es "pv $ FILE.tgz |" tar xzf - -C $ DEST_DIR` Krzysztof Szewczyk vor 9 Jahren 1
Für OS X musste ich die eckige Klammer für die arithmetische Erweiterung verwenden, die Folgendes auszeichnete: `tar cf - / folder-with-big-files -P | pv -s $ [$ (du -sk / folder-with-big-files | awk '') * 1024] | gzip> big-files.tar.gz` Ohne diese Änderung erhielt ich `-bash: Syntaxfehler in der Nähe eines unerwarteten Tokens ')'` Dean Becker vor 9 Jahren 0
Irgendeine Idee, wie man diese Funktion mit `pixz` machen kann? Bei mir funktioniert es mit `gzip`,` pigz` und `xz`, aber nicht mit 'pixz',` pxz 'oder bei der Angabe mehrerer Kerne für xz (`xz -T`) joelostblom vor 8 Jahren 0
Ich habe diesen Oneliner hier in eine Bash-Funktion verpackt: https://github.com/equant/my_bash_tools/blob/master/tarp.bash equant vor 6 Jahren 0
Vielen Dank! Ich habe es zur Sicherung meines Heimatverzeichnisses https://gist.github.com/timabell/68d112d66623d9a4a3643c86a93debee verwendet Tim Abell vor 6 Jahren 0
Hallo, wie kann man mehrere Verzeichnisse / Dateien zu einer einzigen ZIP-Datei zusammenfassen? Sisir vor 5 Jahren 0
71
akira

Sie können pv verwenden, um dies zu erreichen. Um den Fortschritt korrekt zu melden, pvmüssen Sie wissen, wie viele Bytes Sie darauf werfen. Der erste Schritt ist also die Berechnung der Größe (in kByte). Sie können den Fortschrittsbalken auch vollständig löschen und pvIhnen einfach mitteilen, wie viele Bytes er gesehen hat. es würde ein "so viel und so schnell" gemeldet werden.

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

Und dann:

% tar cvf - folder-with-big-files | pv -p -s $k | \  bzip2 -c > big-files.tar.bz2 
Cool. "pv" scheint nicht mit Mac OS X zu kommen, aber ich werde es ausprobieren, sobald ich einen Computer mit MacPorts habe. Könntest du erklären, was du da machst? Nicht ganz sicher, was die erste Zeile genau macht. Svish vor 13 Jahren 0
erste Zeile: Holt Informationen darüber, wie viele Bytes behandelt werden. zweite Zeile: Verwenden Sie die Größe aus der ersten Zeile, damit pv 'progress' rendern kann. da Sie Daten weiterleiten, weiß pv nicht, wie viele Bytes noch kommen werden. akira vor 12 Jahren 4
Ein Zusatz: `SIZE = $ (($ SIZE * 1000/1024))` - Ich weiß nicht, ob dies auf meiner Plattform eine Eigenart ist oder nicht, also füge ich es nicht der Antwort hinzu: `du` gibt die Größe mit 1 KB = 1024 Byte zurück, während "pv" 1 KB = 1000 Byte zu erwarten scheint. (Ich bin auf Ubuntu 10.04) Izkata vor 12 Jahren 0
@lzkata Sie könnten immer `du 'bitten, Ihre bevorzugte Blockgröße zu verwenden, z. B.` du -s --block-size = 1000`, oder Sie arbeiten nur mit einfachen Bytes, z. B. lassen Sie die `k'-Werte von` du` und "pv" ruft an. Trotzdem würde ich erwarten, dass beide "1024" verwenden, sofern nicht anders angegeben, z. B. der Schalter "--si" auf "du". Legolas vor 12 Jahren 2
oder einfach das K-Zeug ablegen und einfach nur Bytes verwenden ("du -sb" und "pv -s" ohne Modifikator). das sollte alle Verwirrung beenden. akira vor 12 Jahren 1
Irgendeine Idee, wie man diese Funktion mit `pixz` machen kann? Bei mir funktioniert es mit `gzip`,` pigz` und `xz`, aber nicht mit 'pixz',` pxz 'oder bei der Angabe mehrerer Kerne für xz (`xz -T`) joelostblom vor 8 Jahren 0
20
Mr. Black

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

Dies ist zum Extrahieren geeignet, aber Sie müssen immer noch einen der komplizierteren Befehle zum Erstellen ausführen (was die ursprüngliche Frage war). Es könnte immer noch mit denen kombiniert werden; es ist nur komplizierter. Daniel H vor 9 Jahren 1
11
helper

Schauen Sie sich die Optionen --checkpointund --checkpoint-actionauf der Tar-Infoseite an (wie 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 Ihres eigenen Checkpoint-Befehls) können Sie einen Prozentsatz berechnen…

Dies sollte die richtige Antwort sein. Andere erklären nur zusätzliche Tools (nicht standardmäßig installiert), um ähnliche Ergebnisse zu erzielen. Carmine Giangregorio vor 7 Jahren 1
@Sardathrion Vielleicht weil es GNU-`tar`-spezifisch ist. phk vor 7 Jahren 0
6
campisano

Inspiriert von der Antwort des Helfer

Eine andere Möglichkeit ist die Verwendung der systemeigenen tarOptionen

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

das Ergebnis ist wie

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

ein vollständiges Beispiel hier

2
Steven Penny

Inspiriert von Noah Spurriers Antwort

function tar { local bf so so=${*: -1} case $(file "$so" | awk '') 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 ') ;; esac command tar "$@" --blocking-factor=$bf \ --checkpoint-action='ttyout=%u%\r' --checkpoint=1 } 

Quelle

Vielleicht ein wenig Kontext und Erklärung? Kissaki vor 9 Jahren 14
2
tanantish

Mir ist gerade der Kommentar zu MacOS aufgefallen, und während ich denke, dass die Lösung von @akira (und pv) viel netter ist , dachte ich, ich würde eine Ahnung und einen schnellen Playaround in meiner MacOS-Box mit tar und einem SIGINFO-Signal verfolgen. Merkwürdigerweise hat es funktioniert :) Wenn Sie ein BSD-ähnliches System verwenden, sollte dies funktionieren, aber bei einer Linux-Box müssen Sie möglicherweise eine SIGUSR1 senden und / oder tarfunktionieren möglicherweise nicht auf die gleiche Weise.

Der Nachteil ist, dass Sie nur eine Ausgabe (on stdout) erhalten, die Ihnen zeigt, wie weit die aktuelle Datei ist, da ich vermute, dass sie keine Ahnung hat, wie groß der Datenstrom ist.

Ja, ein alternativer Ansatz wäre, Teer hochzufahren und regelmäßig SIGINFOs zu senden, wann immer Sie wissen möchten, wie weit er gekommen ist. Wie macht man das?

Der Ad-hoc-Ansatz von Hand

Wenn Sie den Status auf Ad-hoc-Basis überprüfen möchten, können Sie control-T(wie Brian Swift erwähnt) in das entsprechende Fenster klicken, um das SIGINFO-Signal zu senden. Ein Problem dabei ist, dass es an Ihre gesamte Kette gesendet wird, glaube ich, wenn Sie also Folgendes tun:

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

Außerdem wird der Status von bzip2 zusammen mit tar angezeigt:

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 gut, wenn Sie nur prüfen möchten, ob tarSie laufen oder nur langsam laufen. In diesem Fall müssen Sie sich wahrscheinlich nicht allzu viele Gedanken über Formatierungsprobleme machen, da dies nur eine schnelle Überprüfung ist.

Die Art des automatisierten Ansatzes

Wenn Sie wissen, dass es eine Weile dauern wird, Sie aber etwas wie einen Fortschrittsindikator möchten, besteht die Alternative darin, Ihren Teerprozess abzufeuern und in einem anderen Terminal die PID zu erarbeiten und dann in ein Skript zu werfen, das immer wieder ein Signal sendet . Wenn Sie beispielsweise über das folgende Scriptlet verfügen (und es sozusagen aufrufen 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?" 

Wenn Sie es auf diese Weise aufrufen, erhalten Sie tareine eher ähnliche Ausgabe, da Sie nur auf Zielgruppen ausgerichtet sind

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 zugeben, ist irgendwie hübsch.

Zu guter Letzt - mein Scripting ist irgendwie rostig. Wenn also jemand reinrutschen / den Code bereinigen / verbessern / verbessern möchte, dann mach dein Leben :)

Wenn Sie "tar" in der Befehlszeile ausführen, wird durch Eingabe von "control-T" ein SIGINFO gesendet. Wenn dies in einem Skript enthalten wäre, würde dies mit "kill -INFO pid" geschehen Brian Swift vor 12 Jahren 2
Völlig vergessen, "Control-T", ich habe mich natürlich daran gewöhnt, zu viele Konsolenfenster für mich selbst zu spammen. tanantish vor 12 Jahren 0
Warum kann ich -SIGINFO nicht sehen, wenn ich `kill -l` mache? Felipe Alvarez vor 10 Jahren 1
1
bzimage

If you known the file number instead of total size of all of them:

an alternative (less accurate but suitable) is to use the -l option and send in the unix pipe the filenames instead of data content.

Let's have 12345 files into mydir, command is:

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

you can know such value in advance (because of your use case) or use some command like find+wc to discover it:

[myhost@myuser mydir]$ find | wc -l 12345 
Warum setzen Sie diesen Befehl nicht in einen Unterbefehl? =) Kirby vor 6 Jahren 0
`tar cfvz ~ / mytarfile.tgz. | pv -s $ (find. | wc -l) -l> / dev / null`. Funktioniert es für Sie? Kirby vor 6 Jahren 0
0
J_Zar

Methode basierend auf tqdm :

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

Nur Teer verwenden

tarhat die Möglichkeit (seit v1.12) Statusinformationen über Signale zu drucken --totals=$SIGNO, z.

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

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

pkill -SIGUSR1 tar 

Quelle: