xargs
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
xargs erwartet als Parameter ein Kommando, welches dann auf Dateien einer Liste angewandt wird, die von der Standardeingabe gelesen werden. Unter Linux/UNIX kann man fast alle Befehle auf eine einzelne Datei oder auch auf eine ganze Liste von Dateien anwenden. Wenn dies nicht möglich sein sollte, oder sich eine Dateiliste nicht mit Wildcards erstellen lässt, kann man das Kommando xargs verwenden.
Installation¶
Das Programm xargs ist im essentiellen Paket
findutils
von Ubuntu enthalten und ist deshalb auf jedem System installiert.
Syntax¶
xargs wird mit folgender Syntax in einem Terminal aufgerufen [1]:
Kommando1 | xargs [Optionen] [Kommando2]
Hierbei wird das "Kommando2" mit den Argumenten aufgerufen, die das "Kommando1" auf die Standardausgabe gibt. Wenn Kommando2 fehlt, wird echo angenommen.
Optionen¶
Der Befehl xargs
kann mit verschiedenen Optionen aufgerufen werden:
Option | Beschreibung |
-a [Datei] oder --arg-file=[Datei] | Liest die Argumente aus einer Datei anstatt von der Standardeingabe |
-0 oder --null | Argumente werden aufgrund des NULL-Zeichens getrennt anstatt des Leerzeichen. Jedes Zeichen wird wörtlich genommen. Nützlich in Kombination mit der -print0 Option von find . |
-d [Trennzeichen] oder --delimiter=[Trennzeichen] | Argumente werden aufgrund des Trennzeichens getrennt anstatt des Leerzeichens. Jedes Zeichen wird wörtlich genommen. Das Trennzeichen kann ein einzelnes Zeichen sein, ein escaptes Zeichen, ein oktaler oder ein hexadezimaler Code. Mehrere Zeichen sind nicht erlaubt. |
--help | Hilfe anzeigen. |
-i oder -I | Standardmäßig wird "{}" als Ersatz-Zeichenkette verwendet, wie bei der Aktion -exec des Befehls find . xargs fügt dann die Dateiliste an der Stelle ein, wo die Ersatz-Zeichenkette steht. Dies kommt zur Anwendung wenn der Befehl die von xargs erzeugte Dateiliste nicht am Ende erwartet. |
-p oder --interactive | Fragt vor jeder Ausführung, ob fortgefahren werden soll. |
-r oder --no-run-if-empty | Führt "Kommando2" nicht aus, wenn die Standardeingabe keine Nicht-Leerzeichen enthält. |
-n oder --max-args | Führt "Kommando2" auf jeweils eine bestimmt Anzahl von übergebenen Argumenten aus. |
-P oder --max-procs | Führt "Kommando2" mehrfach aus. Mit der Kombination mit -n kann so eine bessere Auslastung des Systems erreicht werden. |
-t oder --verbose | Gibt mehr Informationen darüber, was gemacht wird. |
Beispiele¶
Mit folgendem Befehl werden alle Dateien aus dem aktuellen Verzeichnis und allen darunter liegenden Verzeichnissen entfernt, die auf das Muster *.tmp passen. Dabei werden Dateien, deren Namen Leerzeichen enthalten ebenfalls berücksichtigt:
find . -name "*.tmp" -print0 | xargs -0 rm
Als nächstes eine Anwendung mit der Ersatz-Zeichenkette {}. Alle Dateien des Benutzers mit der uid 1001 werden nach /tmp/klaus/test verschoben. Achtung! Die Verzeichnisstruktur wird dabei nicht wieder hergestellt. Die Dateien landen wirklich alle in /tmp/klaus/test.
find . -uid 1001 -print | xargs -i mv {} /tmp/klaus/test
Wenn man viele Skripte im aktiven Verzeichnis, die einen bestimmten Ausdruck enthalten, ändern will, dann kann man die Berechtigung mit folgendem Befehl ändern:
grep -lZ "Ausdruck" *.sh | xargs -0 chmod u+w
Wenn man eine Datei software.list mit den Namen von Paketen hat, die sich im Verzeichnis ~/installation/ befindet und die wie folgt aufgebaut ist
alltray audacity avidemux azureus compizconfig-settings-manager
kann man mit
xargs -a ~/installation/software.list sudo apt-get install
die Pakete komfortabel alle auf einmal installieren. Dabei werden bereits installierte Pakete übersprungen.
Möchte man mehrere Dateien herunterladen, aber die Geschwindigkeit der Server lastet die eigene Internetverbindung nicht aus, so kann man mit xargs einfach mehrere Instanzen benutzen.
xargs -a downloadlist -n 1 -P 4 wget
Dieser Befehl übergibt jeweils eine URL aus der Datei downloadlist an wget. Dabei wird wget vier mal jeweils mit einer anderen Datei gestartet. So werden vier Dateien auf einmal heruntergeladen und die Internetverbindung optimal ausgenutzt.
Um dem git staging Bereich, ohne temporäre Datei, selektiv Dateien hinzuzufügen, lässt sich die Option -p nutzen.
git ls-files --modified | xargs -n1 -r -p git add
git ls-files --modified gibt alle geänderten Dateien aus. Mit der Übergabe an xargs wird bei jeder Datei nachgefragt, ob die Anweisung git add ausgeführt werden soll.
git add file1.c ?...
Bestätigt wird dies durch 'y' und abgelehnt mit 'n'.
Links¶
GNU xargs 🇬🇧
Shell/Befehlsübersicht Übersicht über verschiedene Shell-Befehle