Wie kann ich mit zip den Gesamtfortschritt anzeigen, ohne die Befehlszeile zu überfluten?

25

Ideal wäre ein Fortschrittsbalken mit fester Länge, eine Datei- oder Bytezahl oder besser ein Timer, der die geschätzte verbleibende Zeit anzeigt.

zipDas Standardverhalten scheint darin zu bestehen, für jede verarbeitete Datei eine Zeile auszudrucken, aber ich möchte nicht, dass die Informationen überladen werden, wenn ich Tausende von Dateien komprimiere. Ich möchte eine Einschätzung, wie lange es dauern wird.

Ich habe die -q( --quiet) -Option in Kombination mit -dg( --display-globaldots) ausprobiert, aber das überflutet stdout nur mit mehreren Punktzeilen und gibt keinen nützlichen Hinweis.

Ich habe auch versucht, -qdgds 10mwie in der Manpage erwähnt, aber das gleiche Ergebnis erzielt.

Ich habe dann -db( --display-bytes) und -dc( --display-counts) ausprobiert, aber es scheint keine globale Option zu geben, daher wird sie erneut für jeden Dateinamen gedruckt.

Zuletzt habe ich es zusammen mit -qlike versucht -qdbdc, aber das gibt einfach nichts aus.

Lustigerweise habe ich auf der Info-Zip-Site eine Manpage gefunden, in der eine -de( --display-est-to-go) -Option erwähnt ist, die "eine Schätzung der Zeit anzeigen soll, die erforderlich ist, um den Archivierungsvorgang abzuschließen".

Das hört sich genau so an, wie ich es möchte, aber das Problem ist, dass meine Version von zipdiese Funktion nicht hat. Ich verwende Ubuntu 14.04.1 64bit, bash-4.3.30 (1) und zip-3.00. Laut Wikipedia ist dies die neueste stabile Version von zip.

Es gibt unveröffentlichte Betaversionen auf der info-zip sourceforge-Seite, aber ich würde meine Daten lieber nicht einer Betaversion anvertrauen.

Fehler
quelle
Protokollieren Sie die Ausgabe in einer Datei und verwenden Sie sie, um allgemeine Informationen bereitzustellen tee. Machen Sie vor dem Start von zip eine Gesamtzählung der Dateien (mit lsoder find -type f) und lesen Sie während des ZIP-Vorgangs in der Protokolldatei die Anzahl der Zeilen der verarbeiteten Dateien, die bereits vorhanden sind (mit grepden richtigen Zeilen und wc -lden Zeilen, die angezeigt werden sollen) zählen), so dass Ihre High-Level-Informationen so etwas wie "234/76438 Dateien verarbeitet" zeigen;
Aquarius Power
Sie können das Timing festlegen, indem Sie die Gesamtgröße der Dateien berücksichtigen und die Größe der Dateien überprüfen, die bereits verarbeitet wurden. Aber ... selbst Dateien mit der gleichen Größe brauchen eine andere Zeit, um verarbeitet zu werden, so dass es immer eine wilde Vermutung sein wird ...
Aquarius Power
Ich weiß nicht, ob Sie bei der Erstellung von ZIP-Dateien stdin verwenden können, aber wenn gzip in Ordnung ist, können Sie so etwas tun wiepv /path/to/file | gzip > /path/to/file.gz
DopeGhoti

Antworten:

11

zipkann Daten auf Standardausgabe komprimieren. Daher können Sie es mit anderen Tools wie kombinieren pv:

zip -qr - [folder] | pv -bep -s $(du -bs [folder] | awk '{print $1}') > [file.zip]

Entfernen Sie eine der -bepOptionen als Ihre Bequemlichkeit.

pedroapero
quelle
Danke dafür! Ich mache das auf meinem Mac (installiere pv, installiere coreutils und ersetze du durch gdu).
Jeff
6

Wenn Sie mit 7z einverstanden sind:

7z a output.zip folder/

Dies gibt Ihnen einen Fortschrittsbalken wie diesen:

Open archive: test.zip
--
Path = test.zip
Type = zip
Physical Size = 232039663

Scanning the drive:
3 folders, 2401 files, 238122225 bytes (228 MiB)

Updating archive: test.zip

Items to compress: 2404

 16% 279 U folder/file.txt  
qwr
quelle
2

Ich habe folgendes erfolgreich angewendet:

zip -r [target_zip] [folder_to_zip] 2>&1 | 
pv -lep -s $(ls -Rl1 [folder_to_zip] | egrep -c '^[-/]') > /dev/null

Und das wird unten erklärt:

zip -r [target_zip] [folder_to_zip] 2> & 1 |

zip rekursiv in die [target_zip] -Datei die [folder_to_zip] -Umleitung von stderr nach stdout. Beachten Sie, dass stderr eine Zeile für jede Datei und jedes Verzeichnis enthält , die verarbeitet werden.

pv -lep -s $ (ls -Ral1 [folder_to_zip] | egrep -c '^ [- /]')> / dev / null

Pipe in pv die Zeilen mit den Dateinamen, wie sie von zip ausgegeben werden. pv wird im Zeilenmodus betrieben (der Zählfortschritt basierend auf den Zeilen und der Größe hängt auch von der Anzahl der zu erwartenden Zeilen ab - siehe Option PV man page -l ).

Die Gesamtgröße der zu erwartenden Zeilen wird durch rekursives Auflisten (ls) des [folder_to_zip] und Zählen der Zeilen ab '-' oder 'd' ermittelt, dh aller Dateien und Verzeichnisse (Verzeichnisse werden ab '/' aufgelistet) .

Das obige liefert einen genauen Prozentsatz der Fertigstellung, da 100% erreicht sind, wenn alle Dateien und Verzeichnisse verarbeitet wurden.

Das Problem bei der Antwort von pedroapero ist, dass der Fortschritt anhand der Anzahl der verarbeiteten (komprimierten) Bytes über der Gesamtanzahl der zu verarbeitenden (unkomprimierten) Bytes berechnet wird. Infolgedessen wird der Vorgang zu etwa 30% abgeschlossen (abhängig von der Kompressionsrate).

Lefteris
quelle