Linux / Befehl xargs: Standardeingabe als Befehlsargumente übergeben

xargs liest Elemente von der Standardeingabe und übergibt sie als Argumente an andere Befehle. Es wird verwendet, wenn die Ausgabe einer Pipe wie Dateinamen anstatt als Eingabedaten für einen Befehl behandelt werden soll.

Die Standard-Trennzeichen sind Leerzeichen und Zeilenumbrüche, und Anführungszeichen sowie Backslashes werden ebenfalls interpretiert. Deshalb sollte man bei der Verarbeitung beliebiger Dateinamen find -print0 zusammen mit xargs -0 verwenden, um sie sicher mit einem NUL-Zeichen zu trennen.

Grundlegende Syntax

Generate command | xargs [options] execute command [fixed arguments...]

Die installierte Implementierung und die Optionen können je nach Distribution variieren. Überprüfen Sie die Beschreibung auf Ihrem aktuellen System mit man xargs.

Erstellen Sie Dateinamen mit Leerzeichen und vergleichen Sie Argumentgrenzen

Führen Sie den gesamten Block aus: Er bereitet jede Eingabe in einem neuen temporären Verzeichnis innerhalb eines Subshells vor und gibt dieses Verzeichnis am Ende aus. Er überschreibt keine Dateien im aktuellen Arbeitsverzeichnis. Prüfen Sie die Ergebnisse und entfernen Sie die Labordaten nur, wenn sie nicht mehr benötigt werden.

(
set -eu
labdir=$(mktemp -d)
cd "$labdir"
mkdir reports
printf 'first\nsecond\n' > 'reports/two words.txt'
printf 'third\n' > 'reports/plain.txt'
printf '%s\0' 'reports/two words.txt' 'reports/plain.txt' |
    xargs -0 -r -n 1 printf 'ARG=[%s]\n'
find reports -type f -name '*.txt' -print0 | xargs -0 -r wc -l
printf 'two words\n' | xargs -n 1 printf 'SPLIT=[%s]\n'
printf 'Lab files: %s\n' "$labdir"
)

ARG bewahrt two words.txt als ein Argument. find traversal kann die Reihenfolge der Ausgaben pro Datei ändern, aber wc sollte die Zählungen von 2 und 1 mit einer Gesamtsumme von 3 melden. Das letzte Beispiel teilt two und words in separate Argumente auf. Verwenden Sie NUL-Trennung für beliebige Dateinamen und erkennen Sie -r als GNU xargs Umgang mit leerer Eingabe. Überprüfen Sie die Argumentgrenzen mit printf, bevor Sie einen destruktiven Befehl anhängen.

Hauptoptionen und Format

Optionen/Format Beschreibung
-0 Elemente mit dem NUL-Zeichen trennen.
-r In der GNU-Implementierung wird es nicht ausgeführt, wenn die Eingabe leer ist.
-n N Geben Sie bis zu N Argumente pro Befehlsausführung weiter.
-P N Führen Sie bis zu N Befehle parallel aus.
-I placeholder Ersetzen Sie Eingabeelemente an der angegebenen Position im Befehl.

Vorsichtsmaßnahmen bei der Verwendung

Wenn Sie Dateinamen basierend auf Zeilenumbrüchen übergeben, wie find ... -print | xargs rm, werden Namen, die Leerzeichen oder Zeilenumbrüche enthalten, falsch aufgeteilt. Für Löschaufgaben verwenden Sie die NUL-Trennung oder find -exec und überprüfen Sie zuerst die Ziele. Parallele Ausführung mit -P ändert die Ausgabereihenfolge und Ressourcenkonkurrenz.

Häufig gestellte Fragen

Worin unterscheidet sich die Verwendung nur einer Pipe von xargs?

command1 | command2 sendet sie an die Standardeingabe von command2. xargs erstellt die gelesenen Werte als Argumente für command2.

Offizielle Dokumentation

Sie können das genaue Verhalten der Optionen und Implementierungsunterschiede auf der xargs-Handbuchseite nachsehen.