Der Befehl xargs

xargs-featured

In diesem Beitrag lernen Sie den Befehl xargs kennen, welcher verwendet wird, um Befehle mit Argumenten auszuführen, welche vom Standard-Input gelesen werden. Viele Befehle lassen sich unter Linux- / UNIX standardmäßig sowohl auf einzelnen Dateien, als auch auf Listen von Dateien anwenden - ist dies nicht möglich, kann der Befehl xargs eingesetzt werden. Ein weiterer Anwendungsfall für xargs ist zudem die Parallelisierung mehrerer Befehle, zum Beispiel rsync, um eine bessere Ausnutzung der Ressourcen des Systems zu ermöglichen.

Zu Beginn wird die allgemeine Syntax des Befehls xargs gezeigt. Anschließend folgen die wichtigsten Optionen des Befehls mitsamt einiger Beispiele.

Allgemeine Syntax

xargs wird neben verschiedenen verfügbaren Optionen ein Befehl übergeben, welcher dann mit den eingelesenen Argumenten ausgeführt wird. Der Befehl kann dabei ganz normal mitsamt beliebiger initialer Argumente angegeben werden - xargs wird die aus dem Standard-Input stdin eingelesenen Argumente dann standardmäßig jeweils am Ende des Befehls anfügen. Die allgemeine Syntax lautet somit folgendermaßen:

xargs [Optionen] [Befehl [Initiale Argumente]]
Beispiel: xargs ohne Optionen

In diesem Beispiel wird der Befehl xargs ohne jegliche Optionen eingesetzt, um die mit dem find-Befehl gefundenen Dateien im aktuellen Arbeitsverzeichnis (und Unterverzeichnissen) alle an den Befehl ls zu übergeben. Dieser sortiert die Dateien mithilfe der Option -S nach ihrer Größe und gibt sie schließlich an den Befehl head weiter, welcher nur die ersten 5 Zeilen ausgibt.
Eingabe:

find ./ -type f | xargs ls -lhS | head -5

Ausgabe:

Die größten fünf im Arbeitsverzeichnis sowie den entsprechenden Unterverzeichnissen vorhandenen Dateien werden ausgegeben.

befehl-xargs-beispiel-1

Wichtige Optionen

In diesem Abschnitt werden die wichtigsten Optionen des Befehls xargs vorgestellt. Einige Beispiele zeigen dabei auch die praktische Anwendung der jeweiligen Optionen.

-a - Einlesen aus Datei

Anstelle des Standard-Input stdin kann auch eine Datei zum Einlesen von Argumenten verwendet werden. Hierzu wird die Option -a verwendet und die entsprechende Datei als Parameter angegeben:

xargs -a [Datei] [Befehl [Initiale Argumente]]

Bei Verwendung dieser Option verbleibt der Standard-Input-Stream stdin unverändert, wenn Befehle ausgeführt werden. Andernfalls wird stdin von /dev/null umgeleitet.

Beispiel: Einlesen aus Datei

Hier sollen die Argumente von xargs aus einer Datei eingelesen werden. Jede Zeile der Eingabedatei stellt in diesem Fall eine Datei dar, welche auch hier wieder mit ls ausgegeben werden soll.
Inhalt /home/hellberg/linux-grundlagen.txt:

/home/hellberg/profi-tutorials/linux/grundlagen/befehl-sudo.txt

/home/hellberg/profi-tutorials/linux/netzwerke/befehl-scp.txt

/home/hellberg/profi-tutorials/linux/administration/befehl-top.txt

Eingabe:

xargs -a /home/hellberg/linux-grundlagen.txt ls -lh

Nach Ausführung:
befehl-xargs-beispiel-2

-0 - NULL-Zeichen als Delimiter

Die eingelesenen Argumente werden aufgrund des NULL-Zeichens anstelle von Leerzeichen getrennt. Außerdem werden jegliche Anführungszeichen sowie Rückschrägstrich-Maskierungen nicht als Sonderzeichen interpretiert - alle Zeichen werden damit wörtlich genommen. Die End-of-File-Zeichenkette (EOF) wird deaktiviert und wie jedes andere Argument interpretiert.

xargs -0 [Befehl [Initiale Argumente]]

-d - Delimiter spezifizieren

Mit dieser Option kann ein Zeichen spezifiziert werden, welches anstelle des standardmäßigen Leerzeichens / Zeilenumbruchs als Delimiter verwendet werden soll. Genau wie auch bei der Option -0 werden alle Zeichen wörtlich genommen und die End-of-File-Zeichenkette deaktiviert.

xargs -d [Zeichen] [Befehl [Initiale Argumente]]

Angegeben werden kann ein einzelnes Zeichen, ein Escape-Zeichen im C-Stil (etwa "\n") oder ein oktaler oder hexadezimaler Escape-Code. Multibyte-Zeichen werden nicht unterstützt.

Beispiel: Delimiter spezifizieren

Dieses Beispiel zeigt, wie mit der Option -d ein Delimiter zur Trennung einzelner Argumente spezifiziert wird. In diesem Fall wird der Delimiter ";" gewählt, um eine durch Semikola getrennte Liste von Home-Verzeichnissen Zeile für Zeile mit echo in die Ausgabe zu schreiben. Zusätzlich wird hier die Option -n verwendet, um die Anzahl Argumente pro Kommandozeile bzw. echo-Befehl auf eines zu beschränken.
Eingabe:

printf "/home/hellberg;/home/admina;/home/bibo" | xargs -n 1 -d ";" echo

Ausgabe:

Die drei in den Standard-Input von xargs gegebenen Home-Verzeichnisse werden nun zeilenweise ausgegeben.

/home/hellberg

/home/admina

/home/bibo

-E - EOF-Marker spezifizieren

Der End-of-File-Marker (EOF) wird mit dieser Option auf die angegebene Zeichenkette gesetzt. Tritt der spezifizierte EOF-Marker als Eingabezeile auf, so wird die verbleibende Eingabe ignoriert.

xargs -E [Zeichenkette] [Befehl [Initiale Argumente]]

Wird keine Zeichenkette angegeben, so gibt es keinen logischen EOF-Marker - dies ist die Standardeinstellung seit GNU xargs der Version 4.2.9. Wird neben -E auch die Option -d oder -0 verwendet, so wird die hier angegebene Zeichenkette nicht gesondert behandelt, sodass stets die gesamte Eingabe gelesen wird.

Beispiel: EOF-Marker spezifizieren

Mithilfe der Option -E wird hier die Zeichenkette "ENDE" als EOF-Marker spezifiziert. Die Argumente für xargs werden aus dem Standard-Input eingelesen und stammen aus der Ausgabe des Befehls cat, welcher auf der Datei "hellberg.txt" ausgeführt wird. Mit echo werden die eingelesenen Argumente dann ausgegeben.
Inhalt hellberg.txt:

hellberg

admina

bibo

ENDE

hedv

Eingabe:

cat hellberg.txt | xargs -E "ENDE" echo

Nach Ausführung:

Es werden nun ausschließlich die ersten drei Zeilen der Eingabe hintereinander, auf einer Zeile ausgegeben. Das Wort "hedv", welches erst hinter dem EOF-Marker "ENDE" auftritt, wird von xargs ignoriert.

hellberg admina bibo

-I - Platzhalter ersetzen

Die Option -I wird verwendet, um eine Platzhalter-Zeichenkette festzulegen, welche in den initialen Argumenten des xargs' übergebenen Befehls durch die vom Standard-Input gelesenen Argumente ersetzt wird. Die Option impliziert zudem die Optionen -x und "-l 1".

xargs -I [Zeichenkette] [Befehl [Initiale Argumente]]

Leerzeichen, welche nicht in Anführungszeichen eingefasst sind, werden nicht zur Trennung der Argumente verwendet - stattdessen wird die Eingabe ausschließlich an Zeilenumbrüchen getrennt.

Beispiel: Platzhalter ersetzen

Mit der Option -I wird in diesem Beispiel ein Platzhalter zur Ersetzung in den initialen Argumenten des xargs' übergebenen Befehls spezifiziert. Der hier verwendete find-Befehl sucht alle Dateien im Verzeichnis profi-tutorials/ des aktuellen Arbeitsverzeichnisses sowie seinen Unterverzeichnissen - diese werden an xargs übergeben und dort mit dem Befehl cp in ein Verzeichnis /daten/sicherung/ kopiert.

Die Option -n für xargs wird zusätzlich verwendet, um pro cp-Befehl jeweils nur ein eingelesenes Argument einzusetzen.

Eingabe:

find profi-tutorials/ -type f | xargs -n 1 -I {} cp {} /daten/sicherung/

Ausgabe:

Direkt im Verzeichnis /daten/sicherung/ befinden sich nun Kopien aller Dateien, welche sich auch in profi-tutorials/ sowie Unterverzeichnissen befinden.

-L - Maximale Zeilen

Das mit dieser Option festgelegte Limit bestimmt, wie viele nichtleere Eingabezeilen maximal pro Kommandozeile verwendet werden. Die Option -x wird impliziert.

xargs -L [Anzahl] [Befehl [Initiale Argumente]]

-n - Maximale Argumente

Hiermit wird die maximale Anzahl Argumente festgelegt, die pro Kommandozeile verwendet werden. Wird die durch die Option -s festgelegte maximale Kommandozeilenlänge überschritten, so verwendet xargs automatisch weniger als die angegebene Anzahl Argumente - außer die Option -x wurde angegeben, welche xargs dann beenden lässt.

xargs -n [Anzahl] [Befehl [Initiale Argumente]]
Beispiel: Maximale Argumente

Mithilfe der Option -n wird die verwendete Anzahl Argumente pro Kommandozeile in diesem Beispiel auf eines begrenzt. Die Ausgabe des Befehls ls erfolgt standardmäßig auf einer Zeile - hier soll mit xargs und dem Befehl echo, welcher jeweils ein Argument erhält, ein Eintrag pro Zeile ausgegeben werden.
Eingabe:

ls | xargs -n 1 echo

Ausgabe:

befehle-systemkontrolle.txt

befehl-hdparm.txt

befehl-top.txt

hardware-informationen-auslesen.txt

-p - Interaktive Ausführung

Unter Verwendung dieser Option wird eine Eingabeaufforderung vor jeder Befehlsausführung gestartet, welche den Benutzer abfragt, ob die jeweilige Befehlszeile ausgeführt werden soll. Der Befehl wird nur dann ausgeführt, wenn die Antwort des Benutzers mit "y" oder "Y" beginnt. Die Option -t wird impliziert.

xargs -p [Befehl [Initiale Argumente]]

-r - Keine Ausführung bei leerem stdin

Bei Verwendung dieser Option wird der Befehl nicht ausgeführt, wenn der Standard-Input stdin komplett leer ist. Standardmäßig wird der Befehl mindestens einmal ausgeführt, selbst wenn es keine Eingabe gibt.

xargs -r [Befehl [Initiale Argumente]]

-s - Kommandozeilenlänge limitieren

Diese Option wird verwendet, um eine maximale Kommandozeilenlänge festzulegen, welche den Befehl selbst, die initialen Argumente und jegliche terminierenden Nullzeichen am Ende der Argument-Zeichenkette umfasst.

xargs -s [Anzahl Zeichen] [Befehl [Initiale Argumente]]

--show-limits - Limits ausgeben

Mithilfe dieser Option können die Limits der Kommandozeilenlänge, welche durch das Betriebssystem, xargs' Wahl der Puffergröße und die Option -s festgelegt werden, ausgegeben werden.

xargs --show-limits [Befehl [Initiale Argumente]]

Soll xargs bei der Ausgabe keinen Befehl ausführen, so kann /dev/null als Eingabe dienen und zusätzlich zudem die Option -r gewählt werden.

xargs -a /dev/null -r --show-limits
Beispiel: Limits ausgeben

Dieses Beispiel zeigt, wie mithilfe der Option --show-limits verschiedene Größen und Begrenzungen ausgegeben werden. Die Verwendung der Datei /dev/null als Eingabe sowie die Option -r sorgen dafür, dass xargs keine Aktionen ausführt.
Eingabe:

xargs -a /dev/null -r --show-limits

Ausgabe:

Die Ausgabe umfasst Informationen zum von den Umgebungsvariablen belegten Speicher (1), der maximal in POSIX erlaubten Argumentlänge (2, 3) der tatsächlich nutzbaren maximalen Befehlslänge (4), der Größe des verwendeten Befehlspuffers (5) sowie dem maximalen Parallelismus (6).

befehl-xargs-beispiel-3

-t - Kommandozeilen ausgeben

Wird diese Option angegeben, so wird jede Kommandozeile vor ihrer Ausführung im Standard-Error-Output stderr ausgegeben.

xargs -t [Befehl [Initiale Argumente]]

-x - Beenden bei Limit-Überschreitung

xargs wird bei Verwendung dieser Option beendet, wenn die maximale Kommandozeilenlänge überschritten wird.

xargs -x [Befehl [Initiale Argumente]]

-P - Maximale Anzahl Prozesse

Mithilfe der Option -P kann die Befehlsausführung von xargs parallelisiert und somit eine gewisse Nebenläufigkeit erreicht werden. Die Option gibt dabei die maximale Anzahl der durch xargs gestarteten Prozesse an, die zu einem Zeitpunkt gleichzeitig laufen dürfen. Standardwert ist entsprechend der standardmäßigen seriellen Ausführung 1. Wird der Wert 0 angegeben, so versucht xargs so viele Prozesse wie möglich gleichzeitig auszuführen.

xargs -P [Anzahl] [Befehl [Initiale Argumente]]
Beispiel: Maximale Anzahl Prozesse

Die maximale Anzahl Prozesse wird in diesem Beispiel mit der Option -P auf den Wert 4 gesetzt, um eine Parallelität bei dem Herunterladen vieler kleiner Dateien mit dem Befehl wget hervorzurufen. Die URLs, welche den wget-Befehlen übergeben werden sollen, sind in der Datei "profi-tutorials-urls.txt" im aktuellen Arbeitsverzeichnis aufgelistet - sie enthält insgesamt 87 Zeilen.

Der Befehl time wird jeweils verwendet, um die Ausführungszeit von xargs zu messen und auszugeben.

Eingabe:

Zunächst sollen einem einzigen wget-Befehl alle 87 URLs übergeben werden, sodass auch nur ein Prozess gestartet wird.

time xargs -a profi-tutorials-urls.txt wget -P /tmp/

Ausgabe:

Der Ausgabe ist zu entnehmen, dass ein einzelner wget-Prozess in diesem Fall etwa 14,3 Sekunden zum Herunterladen aller 87 Dateien benötigt.

befehl-xargs-beispiel-4
Eingabe:

Dem Befehl xargs wird nun zusätzlich die Option -P mit dem Parameter 4 übergeben, um die parallele Ausführung von bis zu 4 wget-Prozessen zu ermöglichen. Weiterhin wird mit der Option -n die maximale Anzahl Argumente pro wget-Befehl auf 20 gesetzt, um den durch das Starten neuer wget-Prozesse erzeugten Overhead möglichst zu minimieren.

time xargs -a profi-tutorials-urls.txt -n 20 -P 4 wget -P /tmp/

Ausgabe:

Bei paralleler Ausführung der wget-Befehle wurden nur noch etwa 8,2 Sekunden zum Herunterladen der 87 Dateien benötigt - dies entspricht in diesem Beispiel einer Zeitersparnis von ca. 42%.

befehl-xargs-beispiel-5

Exit-Codes

Die folgende Tabelle zeigt die verschiedenen Exit-Codes sowie die jeweils angezeigten Status des Befehls xargs.

Exit-Code

Status

0

Ausführung erfolgreich

123

Ein beliebiger Aufruf des gegebenen Befehls wurde mit dem Exit-Code 1-125 beendet

124

Der gegebene Befehl wurde mit dem Exit-Code 255 beendet

125

Der gegebene Befehl wurde von einem Signal beendet

126

Der gegebene Befehl kann nicht ausgeführt werden

127

Der gegebene Befehl wurde nicht gefunden

128+

Werden von der Shell verwendet, um anzuzeigen, dass ein Programm aufgrund eines fatalen Signals abgebrochen wurde

1

Ein anderer Fehler ist aufgetreten (Catchall)

Abonniere JETZT unseren Newsletter!


Verpasse nie wieder neue Beiträge und exklusive Insider-Only-Inhalte!

Joel Benseler

Click Here to Leave a Comment Below

Leave a Comment: