Die Daten, die Sie durch die Pipe führen, sind nicht die Daten der Dateien, md5sum
die verarbeitet werden, sondern die md5sum
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 wir pv
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, dass pv
ein Zeilenmodus Zeilen anstelle von Bytes zählt. In diesem Modus pv
wird der Fortschrittsbalken nur verschoben, wenn im Durchsatz eine neue Zeile gefunden wird, dh pro abgeschlossener Datei md5sum
. In Bash kann diese erste Methode folgendermaßen aussehen:
set -- *.iso; md5sum "$@" | pv --line-mode -s $# | sort
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), und pv
im Zeilenmodus wird die Fortschrittsanzeige jedes Mal verschoben, wenn eine Datei verarbeitet wurde / eine Zeile von ausgegeben wird md5sum
. Wird insbesondere pv
ü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 mit md5sum
. Die Idee ist, die Datenmenge zu berechnen, die md5sum
(oder ein anderes Programm) erzeugt, und diese zur Information zu verwenden pv
. In Bash könnte dies wie folgt aussehen:
os=$(( $( ls -1 | wc -c ) + $( ls -1 | wc -l ) * 34 ))
md5sum * | pv -s $os | sort
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 Datenmenge os
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 das md5sum
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.
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.