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. Entweder für jede einzelne Datei oder für alle oder für beide.
pv $FILE.tgz | tar xzf - -C $DEST_DIR
tar cf - /folder-with-big-files -P | pv -s $[$(du -sk /folder-with-big-files | awk '{print $1}') * 1024] | gzip > big-files.tar.gz
ergab : Ohne diese Änderung bekam ich-bash: syntax error near unexpected token ')'
Sie können pv verwenden , um dies zu erreichen. Um den Fortschritt korrekt zu melden,
pv
muss bekannt sein, 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 nurpv
mitteilen lassen , wie viele Bytes er gesehen hat. es würde ein "so viel und so schnell getan" melden.Und dann:
quelle
pv
Scheint nicht mit Mac OS X zu kommen, aber ich werde es ausprobieren, sobald ich einen Computer mit MacPorts habe. Könnten Sie erklären, was Sie dort tun? Nicht ganz sicher, was die erste Zeile genau macht.SIZE=$(($SIZE * 1000 / 1024))
- Ich weiß nicht, ob dies eine Eigenheit auf meiner speziellen Plattform ist oder nicht, daher füge ich es nicht der Antwort hinzu:du
Gibt eine Größe zurück, bei der 1 KB = 1024 Byte, währendpv
1 KB = 1000 erwartet wird Bytes. (Ich bin auf Ubuntu 10.04)du
Ihre bevorzugte Blockgröße zu verwenden, zBdu -s --block-size=1000
, oder nur mit einfachem Bytes zu arbeiten, zum Beispiel fällt diek
‚s aus dendu
undpv
Anrufen. Trotzdem würde ich davon ausgehen, dass beide verwendet werden,1024
sofern nicht anders angegeben, z. B. das--si
Einschaltendu
.du -sb
undpv -s
ohne Modifikator). das sollte die ganze Verwirrung beenden.bessere Fortschrittsanzeige ..
quelle
Schauen Sie sich die Optionen
--checkpoint
und--checkpoint-action
auf der Tar-Infoseite an (wie bei meiner 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 ...
quelle
tar
spezifisch ist.Inspiriert von der Antwort des Helfers
Eine andere Möglichkeit ist die Verwendung der nativen
tar
OptionenDas Ergebnis ist wie
ein komplettes Beispiel hier
quelle
Verwenden Sie nur Teer
tar
hat die Option (seit v1.12), Statusinformationen auf Signalen auszudrucken--totals=$SIGNO
, z. B .:Die
Total bytes written: [...]
Informationen werden auf jedes USR1-Signal gedruckt, z.Quelle:
quelle
Ich habe gerade den Kommentar zu MacOS bemerkt und obwohl ich denke, dass die Lösung von @akira (und pv) viel besser ist , dachte ich, ich würde eine Vermutung und eine schnelle Umgehung in meiner MacOS-Box mit Teer verfolgen und ein SIGINFO-Signal senden. Komischerweise hat es funktioniert :) Wenn Sie auf einem BSD-ähnlichen System arbeiten, sollte dies funktionieren, aber auf einer Linux-Box müssen Sie möglicherweise ein SIGUSR1 senden und / oder
tar
funktionieren möglicherweise nicht auf die gleiche Weise.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 zu zünden und ihm regelmäßig SIGINFOs zu senden, wann immer Sie wissen möchten, wie weit es gekommen ist. Wie macht man das?
Der ad-hoc, manuelle Ansatz
Wenn Sie in der Lage sein möchten, den Status ad-hoc zu überprüfen, können Sie
control-T
(wie von Brian Swift erwähnt) das entsprechende Fenster anklicken, das das SIGINFO-Signal weiterleitet. Ein Problem dabei ist, dass es meiner Meinung nach an Ihre gesamte Kette gesendet wird. Wenn Sie also Folgendes tun:Sie werden auch sehen, dass bzip2 seinen Status zusammen mit tar meldet:
Dies funktioniert sehr gut, wenn Sie nur überprüfen möchten, ob das Programm nicht funktioniert
tar
oder nur langsam. 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, besteht eine Alternative darin, Ihren Teerprozess auszulösen und in einem anderen Terminal die PID zu ermitteln und sie dann in ein Skript zu werfen, das nur wiederholt ein Signal sendet . Wenn Sie beispielsweise das folgende Scriptlet haben (und es als say aufrufen
script.sh PID-to-signal interval-to-signal-at
):Wenn Sie es auf diese Weise aufrufen, erhalten Sie
tar
eine Ausgabe wie diese , da Sie nur das Targeting durchführenwas 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 :)
quelle
tar
der Befehlszeile ausgeführt werden, wird durch Eingabecontrol-T
ein SIGINFO gesendet. Wenn dies in einem Drehbuch wäre, würde es mitkill -INFO pid
control-T
, habe ich mich eindeutig daran gewöhnt, zu viele Konsolenfenster zu meinem eigenen Besten zukill -l
Inspiriert von Noah Spurriers Antwort
Quelle
quelle
Wenn Sie die Dateinummer anstelle der Gesamtgröße aller Dateien kennen:
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:
Sie können diesen Wert (aufgrund Ihres Anwendungsfalls) im Voraus kennen oder einen Befehl wie find + wc verwenden , um ihn zu ermitteln:
quelle
tar cfvz ~/mytarfile.tgz . | pv -s $(find . | wc -l) -l > /dev/null
. Funktioniert es bei dirMethode basierend auf tqdm :
quelle
Stellen Sie unter macOS zunächst sicher, dass alle Befehle verfügbar sind, und installieren Sie die fehlenden (z . B.
pv
) mithilfe von brew .Wenn Sie nur
tar
ohne Komprimierung arbeiten möchten , gehen Sie mit:Wenn Sie komprimieren möchten , gehen Sie mit:
quelle
Hier sind einige Zahlen einer Prometheus-Sicherung (Metrics Data) auf Debian / Buster AMD64:
Diesen Job abgebrochen, da nicht genügend Speicherplatz verfügbar war.
Experimentieren mit
zstd
als Kompressor zurtar
Überwachung des Fortschritts mitpv
:quelle