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:

  1. ⚓︎ Ein Terminal öffnen

Inhaltsverzeichnis
  1. Installation
  2. Syntax
  3. Optionen
  4. Beispiele
  5. Links

Wiki/Icons/terminal.png 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

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 -IStandardmäß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'.