Der Befehl xargs
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.
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:
-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).
-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.
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%.
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!