Verwendung von pv mit md5sum

6

Ich habe md5summit pv4 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 pvdie 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 4gund | sortauch. Ich habe es auch mit verschiedenen Dateien versucht.

Ich habe versucht, pvmit zu verwenden, catund die Ausgabe war in Ordnung, daher scheint das Problem durch verursacht zu werden md5sum.

EmmaV
quelle
1
Es ist wahrscheinlich ein Pufferproblem. Das heißt, die Ausgabe von 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 im md5sumHandbuch keine Option sehen , um es zeilengepuffert zu machen. Oder Sie verstehen falsch, was passiert. Die übermittelten Daten pvsind nur die Prüfsummen (und Dateinamen). Weiß pvauch nicht, wie viele Daten zu erwarten sind, kann also nicht sagen, wie viel noch übrig ist.
Kusalananda
Es scheint, als ob nur die Prüfsummen und Dateinamen gründlich sind pv(aber das scheint niemanden zu betreffen?). Gibt es eine Möglichkeit, alle Dateidaten durchzugehen pv?
EmmaV
Das Problem dabei ist, dass Sie den Dateinamen verlieren würden. Betrachten Sie pvals "Phantasie cat". Wenn cat file | md5sumSie verwenden, erhalten Sie den MD5-Hash für eine einzelne Datei, können md5sumdas Ergebnis jedoch nicht mit einem Dateinamen versehen.
Kusalananda
2
Sie verwenden pv, um die Ausgabe von md5sum (das sind einige Bytes) und nicht md5sumden 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 ...)
Frostschutz
2
Da Sie nicht 4 GB Daten in die Pipe einspeisen, sondern nur die Ausgabe md5sumfür mehrere Dateien , sollte es ein Schritt in die richtige Richtung sein , die -s 4gOption so zu ändern, dass sie eine Schätzung der Größe der md5sumAusgabe widerspiegelt -s 512.
Ozzy

Antworten:

11

Das pvDienstprogramm ist "schick cat", was bedeutet, dass Sie es pvin den meisten Situationen verwenden können, in denen Sie es verwenden würden cat.

Mit catwith md5sumkönnen Sie die MD5-Prüfsumme einer einzelnen Datei mit berechnen

cat file | md5sum

oder mit pv,

pv file | md5sum

Leider ist es nicht möglich md5sum, den Dateinamen ordnungsgemäß in die Ausgabe einzufügen.

Zum Glück pvist das jetzt wirklich schick catund auf einigen Systemen (Linux) kann es beobachten, wie die Daten durch einen anderen Prozess geleitet werden. Dies erfolgt mithilfe der -dOption mit der Prozess-ID des anderen Prozesses.

Dies bedeutet, dass Sie Dinge wie tun können

md5sum dir/* | sort >sums &
sleep 1
pv -d "$(pgrep -n md5sum)"

Dies würde es ermöglichen pv, den md5sumProzess zu beobachten . Das sleepist da, um zu ermöglichen md5sum, dass im Hintergrund läuft, richtig zu starten. pgrep -n md5sumwürde die PID des zuletzt gestarteten md5sumProzesses zurückgeben, den Sie besitzen. pvwird beendet, sobald der beobachtete Prozess beendet ist.

Ich habe diese spezielle Art der Ausführung pveinige Male getestet und sie scheint im Allgemeinen gut zu funktionieren, aber manchmal scheint sie die Ausgabe von irgendetwas zu beenden, wenn md5sumzur 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

md5sum dir/* >sums &
sleep 1
pv -W -d "$!"
sort -o sums sums

Die -WOption führt dazu pv, dass gewartet wird, bis tatsächlich Daten übertragen werden, obwohl dies auch nicht immer zuverlässig zu funktionieren scheint.

Kusalananda
quelle
Das Bedürfnis nach sleepist etwas überraschend!
Stephen Kitt
1
@StephenKitt Nur so kann ich es dazu bringen, dass es sich etwas vorhersehbar verhält. Ich weiß nicht wirklich, was es tut, aber was auch immer es ist, es scheint möglich zu sein, es "zu früh" zu tun, und die Fortschrittsanzeige wird überhaupt nicht angezeigt.
Kusalananda
5

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.

ozzy
quelle
2
Es ist eine sehr gute Idee, den Fortschritt basierend auf der md5sumAusgabe 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 sein ls. pvUnterstützungen --line-modesind set -- *.iso; md5sum "$@" | pv --line-mode -s $# | sortmöglicherweise gleichwertig und funktionieren weiterhin, wenn Sie md5sum durch sha512sum oder auf andere Weise ersetzen.
Frostschutz
@frostschutz Sie haben zweifellos Recht :-) Dies ist eine schönere, sauberere Lösung.
Ozzy
2

Hier ist ein schmutziger Hack, um Fortschritte pro Datei zu erzielen:

for f in iso/*
do
    pv "$f" | (
        cat > /dev/null &
        md5sum "$f"
        wait
    )
done

Wie es aussieht:

4.15GiB 0:00:32 [ 130MiB/s] [================================>] 100%            
0db0b36fc7bad7b50835f68c369e854c  iso/KNOPPIX_V7.6.1DVD-2016-01-16-EN.iso
 792MiB 0:00:06 [ 130MiB/s] [================================>] 100%            
97537db63e61d20a5cb71d29145b2937  iso/archlinux-2016.10.01-dual.iso
 843MiB 0:00:06 [ 129MiB/s] [================================>] 100%            
1b5dc31e038499b8409f7d4d720e3eba  iso/lubuntu-16.04-desktop-i386.iso
 259MiB 0:00:02 [ 130MiB/s] [=========>                        ] 30% ETA 0:00:04
...

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 pvund md5sumsind 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.

pv iso/* | (
    cat > /dev/null &
    md5sum iso/* | sort
    wait
)

Wie es aussieht (laufend):

15.0GiB 0:01:47 [ 131MiB/s] [===========================>      ] 83% ETA 0:00:21

Wie es aussieht (fertig):

18.0GiB 0:02:11 [ 140MiB/s] [================================>] 100%            
0db0b36fc7bad7b50835f68c369e854c  iso/KNOPPIX_V7.6.1DVD-2016-01-16-EN.iso
155603390e65f2a8341328be3cb63875  iso/systemrescuecd-x86-4.2.0.iso
1b5dc31e038499b8409f7d4d720e3eba  iso/lubuntu-16.04-desktop-i386.iso
1b6ed6ff8d399f53adadfafb20fb0d71  iso/systemrescuecd-x86-4.4.1.iso
25715326d7096c50f7ea126ac20eabfd  iso/openSUSE-13.2-KDE-Live-i686.iso
...

Das ist für die Hacks. Überprüfen Sie andere Antworten auf geeignete Lösungen. ;-);

Frostschutz
quelle
Das Lesen der Daten wäre erforderlich, um sie zu hashen. Das Hashing der Daten ist also mit ziemlicher Sicherheit langsamer als nur das Lesen. Außerdem erzwingen Sie das zweimalige Lesen der Daten für jede Datei (einmal mit pvund einmal mit md5sum).
Kusalananda
@Kusalananda ... und deshalb habe ich es einen Hack genannt! 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.
Frostschutz
... und ja, es kann schief gehen. Wenn Sie dies auf einem langsamen Computer mit einem sehr schnellen Speichermedium tun pvwürden , würden Sie weit voraus sein md5sumund die Daten würden wahrscheinlich zweimal wirklich gelesen, oder in jedem Fall wäre der Fortschrittsbalken nicht mit md5sum at synchron alle.
Frostschutz
1

Ich habe es auch genossen, die 'schicke Katze' zu zähmen pv, für md5sum:-)

  • Ich denke, mein Shellscript ist jetzt ziemlich stabil
  • Es gibt eine usageAusgabe, wenn Sie das Muster nicht richtig eingeben.
  • Es funktioniert mit Platzhaltern, wird jedoch nicht in Unterverzeichnisse zurückgeführt
  • Sie können beispielsweise mehr als ein Muster eingeben ".* *"
  • Es gibt einen Ausführlichkeitsschalter, mit dem die Überprüfung der md5-Summen aktiviert wird ... OK
  • Sie können die entsprechende Ausgabe in eine Datei umleiten. Die Ausgabe der Prozessansicht von pvbleibt im {Bildschirm- / Terminalfenster}.
  • Es gibt zwei pvProzesse in einer for-Schleife, einen globalen und einen für jede Datei, der globale pv"zählt nur die Dateien" und der andere misst die Geschwindigkeit und Menge der übertragenen Daten
  • ANSI-Escape-Sequenzen werden verwendet, um die Prozessansicht in einer stabilen Position zu halten

Ich benutze den Namen md5summer, mache das Shellscript ausführbar und lege es in ein Verzeichnis in PATH (mein ~/binVerzeichnis, das Sie vielleicht bevorzugen /usr/local/bin).

#!/bin/bash

# date      sign     comment
# 20190119  sudodus  created md5summer version 1.0

if [ "$1" == "-v" ]
then
 verbose=true
 shift
else
 verbose=false
fi
if [ $# -ne 1 ]
then
 echo "Usage:    $0  [-v]  <pattern>"
 echo "Example:  $0  '*.iso'      # notice the quotes"
 echo "          $0  -v  '*.iso'  # verbose"
 exit
fi
tmpstr=$(find $1 -maxdepth 0 -type f 2> /dev/null)
if [ "$tmpstr" == "" ]
then
 echo "No such file '$1'. Try another pattern!"
 exit
fi

tmpdir=$(mktemp -d)
tmpfil="$tmpdir/fil1"
tmpfi2="$tmpdir/fil2"
resetvid="\0033[0m"
prev2line="\0033[2F"
next2line="\0033[2E"

sln=1
cln=0
cnt=0
for i in $1
do
 if test -f "$i"
 then
  cln=$((cln+1))
  tmp=$(find -L "$i" -printf "%s")
  cnt=$((cnt+tmp))
 fi
done
echo "
                    number of files = $cln
                    total file size = $cnt B ~ $(($cnt/2**20)) MiB
"
for i in $1
do
 if test -f "$i"
 then
  tmpnam=$(echo -n "$i")
  tmpsum=$(< "$i" pv -ptrbs "$cnt" | md5sum)
  sleep 0.05
  echo "$sln" | pv -ls "$cln" > /dev/null
  sleep 0.05
  sln="$sln
$i"
  sleep 0.05
  printf "${tmpsum/\-}${tmpnam}\n" >> "$tmpfil"
  echo -ne "$prev2line" > /dev/stderr
 fi
done

sync
sleep 0.1
echo -ne "$next2line" > /dev/stderr

echo "-----"
if $verbose
then
 sort -k2 "$tmpfil" | tee "$tmpfi2" | md5sum -c
 echo "-----"
 cat "$tmpfi2"
else
 sort -k2 "$tmpfil"
fi
sleep 0.5
sync
rm -r "$tmpdir"

Demo-Beispiel

Verwendungszweck

$ md5summer 
Usage:    /home/sudodus/bin/md5summer  [-v]  <pattern>
Example:  /home/sudodus/bin/md5summer  '*.iso'      # notice the quotes
          /home/sudodus/bin/md5summer  -v  '*.iso'  # verbose

Ich habe in diesem Verzeichnis getestet

$ ls -1a
.
..
'filename with spaces'
md5summer
md5summer1
md5summer2
subdir
.ttt
zenity-info-message.png

Normale Verwendung plus Muster, um versteckte Dateien anzuzeigen

$ md5summer ".* *"

                    number of files = 6
                    total file size = 12649 B ~ 0 MiB

8,32KiB 0:00:00 [ 156MiB/s] [=============================>                ] 67%
6,00  0:00:00 [ 133k/s] [====================================>] 100%            
-----
184d0995cc8b6d8070f89f15caee35ce  filename with spaces
28227139997996c7838f07cd4c630ffc  md5summer
3383b86a0753e486215280f0baf94399  md5summer1
28227139997996c7838f07cd4c630ffc  md5summer2
31cd03f64a466e680e9c22fef4bcf14b  .ttt
670b8db45e57723b5f1b8a63399cdfa1  zenity-info-message.png

Ausführliche Ausgabe plus Muster, um versteckte Dateien anzuzeigen

$ md5summer -v ".* *"

                    number of files = 6
                    total file size = 12649 B ~ 0 MiB

8,32KiB 0:00:00 [ 184MiB/s] [=============================>                ] 67%
6,00  0:00:00 [ 133k/s] [====================================>] 100%            
-----
filename with spaces: OK
md5summer: OK
md5summer1: OK
md5summer2: OK
.ttt: OK
zenity-info-message.png: OK
-----
184d0995cc8b6d8070f89f15caee35ce  filename with spaces
28227139997996c7838f07cd4c630ffc  md5summer
3383b86a0753e486215280f0baf94399  md5summer1
28227139997996c7838f07cd4c630ffc  md5summer2
31cd03f64a466e680e9c22fef4bcf14b  .ttt
670b8db45e57723b5f1b8a63399cdfa1  zenity-info-message.png

Umleitung in eine Datei, zuerst die Bildschirmausgabe

$ md5summer ".* *" > subdir/save
8,32KiB 0:00:00 [ 180MiB/s] [=============================>                ] 67%
6,00  0:00:00 [ 162k/s] [====================================>] 100%            

und dann die gespeicherte Ausgabe

$ cat subdir/save 

                    number of files = 6
                    total file size = 12649 B ~ 0 MiB

-----
184d0995cc8b6d8070f89f15caee35ce  filename with spaces
28227139997996c7838f07cd4c630ffc  md5summer
3383b86a0753e486215280f0baf94399  md5summer1
28227139997996c7838f07cd4c630ffc  md5summer2
31cd03f64a466e680e9c22fef4bcf14b  .ttt
670b8db45e57723b5f1b8a63399cdfa1  zenity-info-message.png

ISO-Dateien überprüfen

$ md5summer "*.iso"

                    number of files = 10
                    total file size = 7112491008 B ~ 6783 MiB

28,0MiB 0:00:00 [ 160MiB/s] [>                                             ]  0%
10,0  0:00:00 [ 204k/s] [====================================>] 100%            
-----
7a27fdd46a63ba4375896891826c1c88  debian-live-8.6.0-amd64-lxde-desktop.iso
d70eec28cdbdee7f7aa95fb53b9bfdac  debian-live-8.7.1-amd64-standard.iso
382cfbe621ca446d12871b8945b50d20  debian-live-8.8.0-amd64-standard.iso
44473dfe2ee1aad0f71506f1d5862457  debian-live-8.8.0-i386-standard.iso
f396b3532fa84059e7738c3c1827bada  debian-live-9.3.0-amd64-cinnamon.iso
8f6def28ae7cbefa0a6e59407c884466  debian-live-9.6.0-amd64-cinnamon.iso
90b1815da0a5bf4ee4b00eec2b5d3587  debian-testing-amd64-netinst_2017-07-28.iso
8f75074ab98e166b7469299d3e459ac6  mini-amd64-2016-01-21-daily.iso
e580266fba58eb34b05bf6e13f51a047  mini-jessie-32.iso
646c109a9a16c0527ce1c7afa922e2ed  mini-jessie-64.iso
Sudodus
quelle
1

Wie bereits in Kommentaren und anderen Antworten erwähnt:

  1. Sie leiten pvnur md5sumdie Ausgabe weiter: Prüfsummen und Dateinamen; Daher kann pvder Fortschrittsbalken nicht anzeigen, wie viele Daten md5sumgelesen werden.
  2. Eine Größe von 4 GB ist dafür natürlich zu viel. Außerdem ist es unpraktisch , pvdie Größe der Datei (en) anzugeben, in die Sie (manuell, mit -s) einleiten.

Wenn Sie den Inhalt Ihrer Dateien in pvund dann in md5sumweiterleiten, 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:

#!/bin/sh

for file in "$@"; do
    pv -- "$file" |
    md5sum |
    sed 's/-$//' |
    printf '%s%s\n' "$(cat -)" "$file"
done

Das Skript soll aufgerufen werden als:

./script dir/*

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):

function pvsum () {
    for file in "$@"; do
        pv -- "$file" | md5sum | sed 's/-$//' | printf '%s%s\n' "$(cat -)" "$file"
    done
}

Auf diese Weise entspricht der Befehl pvsum dir/* | sortIhrem md5sum dir/* | pv -s <size> | sort.

Seine Ausgabe:

$ ./testscript testdir/*
4.00GiB 0:00:09 [ 446MiB/s] [==============================>] 100%            
9dab5f8add1f699bca108f99e5fa5342  testdir/file1
1.00GiB 0:00:02 [ 447MiB/s] [==============================>] 100%            
06a738a71e3fd3119922bdac259fe29a  testdir/file2

Was es macht:

  • Es durchläuft die angegebenen Dateien und für jede:
    • Leitet die Datei von pvin weiter md5sumund zeigt den Standard-Fortschrittsbalken an.
    • sedwird verwendet, um das -gedruckte von zu entfernen md5sum(das von der Standardeingabe liest); Dies versucht auch, die Ausgabe für den Verbrauch geeignet zu machen md5sum -c(danke an Frostschutz für den Hinweis) 1 .
    • Druckt die Prüfsumme gefolgt vom Dateinamen in der Standardausgabe.

Über sort:

Ich bin mir nicht sicher über Ihre erwarteten Ergebnisse, deshalb habe ich es einfach ignoriert. Da pvder Fortschrittsbalken in den Standardfehler geschrieben wird, wird durch das Weiterleiten alles in sortdie pvAusgabe von md5sumder Ausgabe getrennt.
Wie auch immer, können Sie einfach append | sortnach donein 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 -cwenn Dateinamen Zeilenumbrüche enthalten. Der Umgang mit Zeilenumbrüchen ist möglich, aber einige Versionen von md5sumverhalten 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 md5sumein Versuch zur Lösung dieses Problems sein:

for file in "$@"; do
    pv -- "$file" |
    md5sum |
    sed 's/-$//' |
    printf '%s%s\n' "$(cat -)" "$file" |
    sed -n 'H; 1h; $!d; g; s/\\/\\\\/g; s/\n/\\n/g; t x; p; q; :x s/^/\\/; p;'
done

Wo die einzige Ergänzung, das Finale sed, wird:

  • Fügen Sie die gesamte Eingabe, Prüfsumme und den Namen der aktuellen Datei in den Musterbereich ein, da diese möglicherweise Zeilenumbrüche enthält: HHängt einen Zeilenumbruch und den aktuellen Musterbereich an den Haltebereich an; 1hüberschreibt vorherige H, nur für die erste Zeile, und macht dasselbe, ohne jedoch eine neue Zeile anzuhängen; $!dStartet einen neuen Zyklus, wenn die aktuelle Zeile nicht die letzte ist. gSetzt den Inhalt des Haltebereichs in den Musterbereich.
  • Escape mit einem Backslash ( \) einen Backslash im resultierenden Musterbereich.
  • Ersetzen \nSie den resultierenden Musterbereich durch eine neue Zeile.
  • Nur wenn mindestens ein Backslash oder eine Newline ersetzt wurde ( t x: Verzweigung zum Label x), wird am Anfang der Prüfsumme ein Backslash hinzugefügt, um zu signalisieren, md5sum -cdass 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 -ndeaktiviert das automatische Drucken).
fra-san
quelle