[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal:Ein Terminal öffnen] }}} [[Inhaltsverzeichnis()]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] '''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]: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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'''. {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl 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. {{{#!vorlage Befehl git add file1.c ?... }}} Bestätigt wird dies durch 'y' und abgelehnt mit 'n'. = Links = * [wikipedia_en:xargs:xargs in der Wikipedia] * [wikipedia:wiki/Xargs:xargs] * [http://www.gnu.org/software/findutils/manual/html_node/find_html/Invoking-xargs.html GNU xargs] {en} * [http://www.softpanorama.org/Tools/xargs.shtml Softpanorama] * [:Shell/Befehlsübersicht:] {Übersicht} Übersicht über verschiedene Shell-Befehle # tag: Shell