Xargs-Argument als Zeichenfolge mit '>' an einen anderen Befehl übergeben?

9

Angenommen, ich habe eine Reihe von Dateien in /tmp/.

ich mache

find . -type f | xargs -iFILES

Und ich möchte md5sumin jeder Datei eine Datei erstellen, die in eine Datei mit demselben Namen, aber mit .md5Erweiterung ausgegeben wird.

find . -type f | xargs -iFILES md5sum FILES > FILES.md5

Dies soll eine MD5-Datei für jede Datei erstellen, die mit dem Befehl find gefunden wird. Stattdessen wird eine einzelne FILES.md5-Datei auf der Festplatte mit Prüfsummen aus allen Dateien erstellt.

Wie kann ich dem Befehl md5sum sagen, dass die DATEIEN den aktuellen Dateinamen und keine FILES-Literalzeichenfolge darstellen?

Jemand benutzt Sie immer noch MS-DOS
quelle

Antworten:

4

Sie müssen eine Möglichkeit haben zu sagen, dass Sie die Ausgabe von md5suman eine Datei senden möchten . Da find(oder xargs) diese Funktionalität nicht integriert ist und md5sumnur weiß, wie auf Standardausgabe gedruckt wird, ist eine Shell-Umleitung der einfachste Weg.

Beachten Sie, dass Ihr Befehl im allgemeinen Fall aus einem anderen Grund nicht funktioniert: Das Ausgabeformat von findist nicht das Eingabeformat von xargs, sie unterscheiden sich durch Dateinamen, die Leerzeichen oder enthalten \"'. Verwenden Sie find -execstattdessen.

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;
Gilles 'SO - hör auf böse zu sein'
quelle
7

Sie müssen eine Subshell verwenden, um die E / A-Umleitung zu handhaben:

find . -type f | xargs -iFILES sh -c 'md5sum FILES > FILES.md5'
jsbillings
quelle
5

Mit GNU Parallel können Sie Folgendes tun:

find . -type f | parallel md5sum {} \> {}.md5

Sie erhalten den zusätzlichen Vorteil, dass Sie md5sum parallel ausführen und folgende Dateien verwenden können:

My brother's 12" records.txt

führt nicht zum Absturz Ihres Befehls. Sehen Sie sich das Intro-Video an, um mehr zu erfahren: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Ole Tange
quelle