Ich habe md5sum
mit pv
4 GiB Dateien überprüft, die sich im selben Verzeichnis befinden:
md5sum dir/* | pv -s 4g | sort
Der Befehl wird in ca. 28 Sekunden erfolgreich ausgeführt, aber pv
die Ausgabe ist falsch. Dies ist die Art der Ausgabe, die durchgehend angezeigt wird:
219 B 0:00:07 [ 125 B/s ] [> ] 0% ETA 1668:01:09:02
Es ist so ohne -s 4g
und | sort
auch. Ich habe es auch mit verschiedenen Dateien versucht.
Ich habe versucht, pv
mit zu verwenden, cat
und die Ausgabe war in Ordnung, daher scheint das Problem durch verursacht zu werden md5sum
.
md5sum
ist nicht zeilengepuffert und kommt erst an,pv
wenn der Prozess abgeschlossen ist oder genügend Daten erzeugt hat, um den Ausgabepuffer zu füllen. Ich kann immd5sum
Handbuch keine Option sehen , um es zeilengepuffert zu machen. Oder Sie verstehen falsch, was passiert. Die übermittelten Datenpv
sind nur die Prüfsummen (und Dateinamen). Weißpv
auch nicht, wie viele Daten zu erwarten sind, kann also nicht sagen, wie viel noch übrig ist.pv
(aber das scheint niemanden zu betreffen?). Gibt es eine Möglichkeit, alle Dateidaten durchzugehenpv
?pv
als "Phantasiecat
". Wenncat file | md5sum
Sie verwenden, erhalten Sie den MD5-Hash für eine einzelne Datei, könnenmd5sum
das Ergebnis jedoch nicht mit einem Dateinamen versehen.pv
, um die Ausgabe von md5sum (das sind einige Bytes) und nichtmd5sum
den eigenen Fortschritt beim Lesen der Dateien selbst zu bewerten . Vielleicht ist diese Antwort verwandt: unix.stackexchange.com/q/16826/30851 (beim zweiten Gedanken vielleicht nicht - es geht um Textdateien ...)md5sum
für mehrere Dateien , sollte es ein Schritt in die richtige Richtung sein , die-s 4g
Option so zu ändern, dass sie eine Schätzung der Größe dermd5sum
Ausgabe widerspiegelt-s 512
.Antworten:
Das
pv
Dienstprogramm ist "schickcat
", was bedeutet, dass Sie espv
in den meisten Situationen verwenden können, in denen Sie es verwenden würdencat
.Mit
cat
withmd5sum
können Sie die MD5-Prüfsumme einer einzelnen Datei mit berechnenoder mit
pv
,Leider ist es nicht möglich
md5sum
, den Dateinamen ordnungsgemäß in die Ausgabe einzufügen.Zum Glück
pv
ist das jetzt wirklich schickcat
und auf einigen Systemen (Linux) kann es beobachten, wie die Daten durch einen anderen Prozess geleitet werden. Dies erfolgt mithilfe der-d
Option mit der Prozess-ID des anderen Prozesses.Dies bedeutet, dass Sie Dinge wie tun können
Dies würde es ermöglichen
pv
, denmd5sum
Prozess zu beobachten . Dassleep
ist da, um zu ermöglichenmd5sum
, dass im Hintergrund läuft, richtig zu starten.pgrep -n md5sum
würde die PID des zuletzt gestartetenmd5sum
Prozesses zurückgeben, den Sie besitzen.pv
wird beendet, sobald der beobachtete Prozess beendet ist.Ich habe diese spezielle Art der Ausführung
pv
einige Male getestet und sie scheint im Allgemeinen gut zu funktionieren, aber manchmal scheint sie die Ausgabe von irgendetwas zu beenden, wennmd5sum
zur nächsten Datei gewechselt wird . Manchmal scheint es falsche Hintergrundaufgaben in der Shell zu erzeugen.Es wäre wahrscheinlich am sichersten, es als zu betreiben
Die
-W
Option führt dazupv
, dass gewartet wird, bis tatsächlich Daten übertragen werden, obwohl dies auch nicht immer zuverlässig zu funktionieren scheint.quelle
sleep
ist etwas überraschend!Die Daten, die Sie durch die Pipe führen, sind nicht die Daten der Dateien,
md5sum
die verarbeitet werden, sondern diemd5sum
Ausgabe, die für jede Datei aus einer Zeile besteht, die Folgendes umfasst: den MD5-Hash, zwei Leerzeichen und den Dateinamen. Da wir dies im Voraus wissen, können wirpv
entsprechend informieren , damit es eine genaue Fortschrittsanzeige anzeigen kann. Es gibt zwei Möglichkeiten, dies zu tun.Die erste bevorzugte Methode (von Frostschutz vorgeschlagen) nutzt die Tatsache, dass
md5sum
eine Zeile pro verarbeiteter Datei generiert wird, und die Tatsache, dasspv
ein Zeilenmodus Zeilen anstelle von Bytes zählt. In diesem Moduspv
wird der Fortschrittsbalken nur verschoben, wenn im Durchsatz eine neue Zeile gefunden wird, dh pro abgeschlossener Dateimd5sum
. In Bash kann diese erste Methode folgendermaßen aussehen:Das
set
eingebaute Element wird verwendet, um die Positionsparameter für die zu verarbeitenden Dateien festzulegen (das*.iso
Shell-Muster wird durch die Shell erweitert).md5sum
wird dann angewiesen, diese Dateien zu verarbeiten ($@
erweitert sich auf die Positionsparameter), undpv
im Zeilenmodus wird die Fortschrittsanzeige jedes Mal verschoben, wenn eine Datei verarbeitet wurde / eine Zeile von ausgegeben wirdmd5sum
. Wird insbesonderepv
über die Gesamtzahl der zu erwartenden Zeilen informiert (-s $#
), da der spezielle Shell-Parameter$#
auf die Anzahl der Positionsargumente erweitert wird.Die zweite Methode ist nicht zeilenbasiert, sondern bytebasiert. Mit
md5sum
dieser unnötig komplizierte, aber ein anderes Programm möglicherweise nicht produzieren Linien , sondern zum Beispiel kontinuierlichen Daten, und dann kann dieser Ansatz sinnvoll sein. Ich illustriere es aber mitmd5sum
. Die Idee ist, die Datenmenge zu berechnen, diemd5sum
(oder ein anderes Programm) erzeugt, und diese zur Information zu verwendenpv
. In Bash könnte dies wie folgt aussehen:Die erste Zeile berechnet die
os
Schätzung der Ausgabegröße ( ): Der erste Term ist die Anzahl der zum Codieren der Dateinamen erforderlichen Bytes (inkl. Newline), der zweite Term die Anzahl der zum Codieren der MD5-Hashes verwendeten Bytes (jeweils 32 Bytes). plus 2 Leerzeichen. In der zweiten Zeile teilen wir mit,pv
dass die erwartete Datenmengeos
Bytes sind, sodass ein genauer Fortschrittsindikator angezeigt werden kann, der zu 100% führt (welcher Indikator wird pro fertiger md5summed-Datei aktualisiert).Beide Methoden sind natürlich nur dann sinnvoll, wenn mehrere Dateien verarbeitet werden sollen. Es sollte auch beachtet werden, dass der Fortschrittsindikator als etwas irreführend angesehen werden kann , da die Ausgabe von
md5sum
nicht mit der Zeit zusammenhängt, die dasmd5sum
Programm für die Verarbeitung der zugrunde liegenden Daten aufwenden muss. Bei der zweiten Methode liefert die Datei mit dem kürzesten Namen beispielsweise die Aktualisierung mit dem geringsten Fortschritt, obwohl sie möglicherweise die größte Größe hat. Wenn alle Dateien ähnliche Größen und Namen haben, sollte dies nicht viel ausmachen.quelle
md5sum
Ausgabe zu berechnen (obwohl der Fortschritt angibt, wie viele Dateien noch übrig sind und nicht - wie groß oder wie lange das dauern würde). Es sollte jedoch kein Parsen erforderlich seinls
.pv
Unterstützungen--line-mode
sindset -- *.iso; md5sum "$@" | pv --line-mode -s $# | sort
möglicherweise gleichwertig und funktionieren weiterhin, wenn Sie md5sum durch sha512sum oder auf andere Weise ersetzen.Hier ist ein schmutziger Hack, um Fortschritte pro Datei zu erzielen:
Wie es aussieht:
Dies macht nun mehrere Annahmen. Erstens ist das Lesen von Daten langsamer als das Hashing. Zweitens, dass OS die I / O - Cache so die Daten nicht (physisch) gelesen werden zweimal obwohl
pv
undmd5sum
sind völlig unabhängig Leser.Das Schöne an einem so schmutzigen, schmutzigen Hack ist, dass Sie ihn einfach anpassen können, um einen Fortschrittsbalken für alle Daten zu erstellen, nicht nur für eine Datei. Und mache immer noch seltsame Dinge wie das anschließende Sortieren der Ausgabe.
Wie es aussieht (laufend):
Wie es aussieht (fertig):
Das ist für die Hacks. Überprüfen Sie andere Antworten auf geeignete Lösungen. ;-);
quelle
pv
und einmal mitmd5sum
).pv < /dev/zero | md5sum
-> 637MiB / s auf meinem Computer. Die ISO-Dateien, mit denen ich getestet habe, befanden sich auf einem USB3-Stick. 140 MB / s entsprechen ungefähr der maximalen Lesegeschwindigkeit. Md5sum kann also Daten schneller hashen als lesen. Ja, es liest Daten zweimal, aber das ist pedantisch - dank des Caching des Betriebssystems liest der USB-Stick sie immer noch nur einmal. und das Ausführen dieses Hacks ist (in meinem Fall) nicht langsamer als das Ausführen von md5sum allein ohne Fortschrittsbalken.pv
würden , würden Sie weit voraus seinmd5sum
und die Daten würden wahrscheinlich zweimal wirklich gelesen, oder in jedem Fall wäre der Fortschrittsbalken nicht mit md5sum at synchron alle.Ich habe es auch genossen, die 'schicke Katze' zu zähmen
pv
, fürmd5sum
:-)usage
Ausgabe, wenn Sie das Muster nicht richtig eingeben.".* *"
... OK
pv
bleibt im {Bildschirm- / Terminalfenster}.pv
Prozesse in einer for-Schleife, einen globalen und einen für jede Datei, der globalepv
"zählt nur die Dateien" und der andere misst die Geschwindigkeit und Menge der übertragenen DatenIch benutze den Namen
md5summer
, mache das Shellscript ausführbar und lege es in ein Verzeichnis in PATH (mein~/bin
Verzeichnis, das Sie vielleicht bevorzugen/usr/local/bin
).Demo-Beispiel
Verwendungszweck
Ich habe in diesem Verzeichnis getestet
Normale Verwendung plus Muster, um versteckte Dateien anzuzeigen
Ausführliche Ausgabe plus Muster, um versteckte Dateien anzuzeigen
Umleitung in eine Datei, zuerst die Bildschirmausgabe
und dann die gespeicherte Ausgabe
ISO-Dateien überprüfen
quelle
Wie bereits in Kommentaren und anderen Antworten erwähnt:
pv
nurmd5sum
die Ausgabe weiter: Prüfsummen und Dateinamen; Daher kannpv
der Fortschrittsbalken nicht anzeigen, wie viele Datenmd5sum
gelesen werden.pv
die Größe der Datei (en) anzugeben, in die Sie (manuell, mit-s
) einleiten.Wenn Sie den Inhalt Ihrer Dateien in
pv
und dann inmd5sum
weiterleiten, wird ein Fortschrittsbalken angezeigt, aber die Dateinamen gehen verloren.Dieser Code ist eine nicht so elegante Möglichkeit, beides zu haben - einen aussagekräftigen Fortschrittsbalken und Dateinamen mit Prüfsummen:
Das Skript soll aufgerufen werden als:
Sie können es natürlich als Funktion deklarieren, um zu vermeiden, dass Sie seinen Pfad eingeben müssen, um es aufzurufen (oder zu Ihrem hinzuzufügen
PATH
):Auf diese Weise entspricht der Befehl
pvsum dir/* | sort
Ihremmd5sum dir/* | pv -s <size> | sort
.Seine Ausgabe:
Was es macht:
pv
in weitermd5sum
und zeigt den Standard-Fortschrittsbalken an.sed
wird verwendet, um das-
gedruckte von zu entfernenmd5sum
(das von der Standardeingabe liest); Dies versucht auch, die Ausgabe für den Verbrauch geeignet zu machenmd5sum -c
(danke an Frostschutz für den Hinweis) 1 .Über
sort
:Ich bin mir nicht sicher über Ihre erwarteten Ergebnisse, deshalb habe ich es einfach ignoriert. Da
pv
der Fortschrittsbalken in den Standardfehler geschrieben wird, wird durch das Weiterleiten alles insort
diepv
Ausgabe vonmd5sum
der Ausgabe getrennt.Wie auch immer, können Sie einfach append
| sort
nachdone
in dem obigen Code und überprüfen , ob das Ergebnis in Ordnung zu Ihnen ist.1 Beachten Sie, dass die Ausgabe des oben gezeigten Codes nicht geeignet ist,
md5sum -c
wenn Dateinamen Zeilenumbrüche enthalten. Der Umgang mit Zeilenumbrüchen ist möglich, aber einige Versionen vonmd5sum
verhalten sich in dieser Hinsicht anders (siehe z. B. Antworten auf diese Frage ), was eine allgemeine Lösung nicht einfach macht (und außerhalb des Rahmens dieser Antwort liegt).Unter der Annahme einer neueren Version von könnte
md5sum
ein Versuch zur Lösung dieses Problems sein:Wo die einzige Ergänzung, das Finale
sed
, wird:H
Hängt einen Zeilenumbruch und den aktuellen Musterbereich an den Haltebereich an;1h
überschreibt vorherigeH
, nur für die erste Zeile, und macht dasselbe, ohne jedoch eine neue Zeile anzuhängen;$!d
Startet einen neuen Zyklus, wenn die aktuelle Zeile nicht die letzte ist.g
Setzt den Inhalt des Haltebereichs in den Musterbereich.\
) einen Backslash im resultierenden Musterbereich.\n
Sie den resultierenden Musterbereich durch eine neue Zeile.t x
: Verzweigung zum Labelx
), wird am Anfang der Prüfsumme ein Backslash hinzugefügt, um zu signalisieren,md5sum -c
dass etwas nicht entkommen muss. sonst einfach aufhören. In beiden Fällen drucken (p
) Sie den Musterbereich kurz vor dem Beenden auf die Standardausgabe (die Option-n
deaktiviert das automatische Drucken).quelle