Die Daten, die Sie durch die Pipe führen, sind nicht die Daten der Dateien, md5sumdie verarbeitet werden, sondern die md5sumAusgabe, 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 pventsprechend 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 md5sumeine Zeile pro verarbeiteter Datei generiert wird, und die Tatsache, dass pvein Zeilenmodus Zeilen anstelle von Bytes zählt. In diesem Modus pvwird 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 seteingebaute Element wird verwendet, um die Positionsparameter für die zu verarbeitenden Dateien festzulegen (das *.isoShell-Muster wird durch die Shell erweitert). md5sumwird dann angewiesen, diese Dateien zu verarbeiten ( $@erweitert sich auf die Positionsparameter), und pvim 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 md5sumdieser 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 osSchä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, pvdass die erwartete Datenmenge osBytes 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 md5sumnicht mit der Zeit zusammenhängt, die das md5sumProgramm 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.
md5sumist nicht zeilengepuffert und kommt erst an,pvwenn der Prozess abgeschlossen ist oder genügend Daten erzeugt hat, um den Ausgabepuffer zu füllen. Ich kann immd5sumHandbuch keine Option sehen , um es zeilengepuffert zu machen. Oder Sie verstehen falsch, was passiert. Die übermittelten Datenpvsind nur die Prüfsummen (und Dateinamen). Weißpvauch nicht, wie viele Daten zu erwarten sind, kann also nicht sagen, wie viel noch übrig ist.