Der Befehl xargs liest Argumente aus der Standardeingabe und führt damit einen angegebenen Befehl aus. Er ist das Bindeglied zwischen der Ausgabe eines Befehls und der Eingabe eines anderen.
Syntax
xargs [OPTIONEN] [BEFEHL [ARGUMENTE]]
OPTIONEN- Flags, die das Verhalten vonxargssteuern.BEFEHL- Der auszuführende Befehl. Ohne Angabe wird/bin/echoverwendet.ARGUMENTE- Optionale Startargumente für den Befehl.
Grundlegende Verwendung
Im einfachsten Fall übergibt xargs alle gelesenen Werte als Argumente an einen Befehl:
echo "datei1 datei2 datei3" | xargs touch
Dieser Befehl erstellt drei Dateien. Das entspricht dem direkten Aufruf:
touch datei1 datei2 datei3
Ausführung anzeigen und bestätigen
Die Option -t (oder --verbose) zeigt jeden Befehl vor der Ausführung an:
echo "datei1 datei2 datei3" | xargs -t touch
Ausgabe:
touch datei1 datei2 datei3
Mit -p (oder --interactive) fragt xargs vor jeder Ausführung nach Bestätigung:
echo "datei1 datei2 datei3" | xargs -p touch
Tippe y zur Bestätigung. Diese Option ist besonders nützlich bei Befehlen, die Daten löschen oder verändern.
Anzahl der Argumente begrenzen
Mit -n (oder --max-args) legst du fest, wie viele Argumente pro Befehlsaufruf übergeben werden:
echo "datei1 datei2 datei3" | xargs -n 1 -t touch
Ausgabe:
touch datei1
touch datei2
touch datei3
Der touch-Befehl wird hier dreimal mit je einem Argument ausgeführt statt einmal mit drei Argumenten.
Eigenes Trennzeichen definieren
Standardmäßig trennt xargs Argumente an Leerzeichen und Zeilenumbrüchen. Mit -d (oder --delimiter) kannst du ein anderes Trennzeichen festlegen:
echo "datei1;datei2;datei3" | xargs -d \; -t touch
Ausgabe:
touch datei1 datei2 datei3
Platzhalter für mehrere Befehle
Die Option -I definiert einen Platzhalter, der in der Befehlszeile durch das aktuelle Argument ersetzt wird. So kannst du mehrere Befehle pro Argument ausführen:
echo "datei1 datei2 datei3" | xargs -I % sh -c 'touch %; ls -l %'
Der Platzhalter % ist üblich, aber du kannst jeden beliebigen String verwenden:
echo "datei1 datei2" | xargs -I FILE sh -c 'touch FILE; ls -l FILE'
Argumente aus einer Datei lesen
Mit -a (oder --arg-file) liest xargs die Argumente aus einer Datei statt von der Standardeingabe:
xargs -a server.txt -L 1 ping -c 1
Die Option -L 1 sorgt dafür, dass jede Zeile einzeln verarbeitet wird. Ohne diese Option würde xargs alle Zeilen als Argumente an einen einzigen Befehlsaufruf übergeben.
Kombination mit find
Die häufigste Verwendung von xargs ist die Kombination mit find. Um Probleme mit Sonderzeichen in Dateinamen zu vermeiden, verwende find -print0 zusammen mit xargs -0:
find /var/cache -type f -print0 | xargs -0 rm -f
Die Option -print0 von find trennt die Ausgabe mit Nullzeichen statt Zeilenumbrüchen. Die Option -0 von xargs interpretiert diese Ausgabe korrekt.
Ein weiteres Beispiel - alle .log-Dateien finden und deren Größe anzeigen:
find /var/log -name "*.log" -print0 | xargs -0 du -h
Leerzeichen entfernen
Ein nützlicher Nebeneffekt: xargs ohne Argumente entfernt führende und abschließende Leerzeichen aus einer Zeichenkette:
echo " Text mit Leerzeichen " | xargs
Ausgabe:
Text mit Leerzeichen
Das ist praktisch in Shell-Skripten, wenn du Variablen vergleichen musst:
#!/bin/bash
VAR1=" kommandozeile.org "
VAR2="kommandozeile.org"
if [[ $(echo "$VAR1" | xargs) == "$VAR2" ]]; then
echo "Die Zeichenketten sind gleich."
fi
Wichtige Optionen im Überblick
| Option | Beschreibung |
|---|---|
-t | Zeigt jeden Befehl vor der Ausführung an |
-p | Fragt vor jeder Ausführung nach Bestätigung |
-n ZAHL | Begrenzt die Anzahl der Argumente pro Aufruf |
-d ZEICHEN | Definiert ein eigenes Trennzeichen |
-I PLATZHALTER | Ersetzt den Platzhalter durch das Argument |
-L ZAHL | Verarbeitet eine bestimmte Anzahl Zeilen pro Aufruf |
-a DATEI | Liest Argumente aus einer Datei |
-0 | Erwartet Nullzeichen als Trennzeichen |
Zusammenfassung
Der Befehl xargs wandelt Standardeingaben in Befehlsargumente um. In Kombination mit find und anderen Befehlen ermöglicht er komplexe Dateioperationen in einer einzigen Befehlszeile.