xargs-Befehl: Verwendung, die Optionen -n und -I und Einsatz mit find
Der xargs-Befehl ist ein Linux-Werkzeug, das über die Standardeingabe empfangene Zeilen und Wörter in Argumente eines anderen Befehls umwandelt und diesen ausführt. Als wir in einem Arbeitsordner auf einem AlmaLinux-9-Server drei von find gefundene Logdateien mit xargs an wc übergeben haben, wurde eine Datei mit Leerzeichen im Namen in zwei Teile zerlegt und es gab einen Fehler, und mit -print0 und -0 erschienen die Zeilenzahlen aller drei Dateien.
Die Ausgaben unten stammen aus einem Arbeitsordner unter dem root-Konto auf einem AlmaLinux-9.8-Server. Namensliste, Logs und temporäre Dateien sind für den Test erstellte Beispieldateien, und die IP-Adressen und Ordnerpfade darin sind ebenfalls Beispielwerte.
1️⃣ Grundlegende Verwendung des xargs-Befehls
xargs teilt die vom vorherigen Befehl übergebene Standardeingabe an Leerzeichen und Zeilenumbrüchen und führt den dahinter stehenden Befehl mit diesen Teilen als Argumenten aus. Geprüft haben wir das mit names.txt, die pro Zeile einen Namen enthält.
cat names.txtalice
bob
carol
dave
erinÜbergibst du die Ausgabe von cat an xargs echo, werden die fünf Zeilen zu Argumenten eines einzigen echo und erscheinen in einer Zeile.
cat names.txt | xargs echoalice bob carol dave erinSchreibst du keinen Befehl dahinter, führt xargs echo aus, das Ergebnis ist also gleich.
cat names.txt | xargsalice bob carol dave erinEine Pipe verbindet die Ausgabe des vorherigen Befehls mit der Standardeingabe des nächsten, in dessen Argumente gelangt also nichts. Leitest du list.txt mit drei Dateinamen nur per Pipe an wc -l, zählt wc die 3 Zeilen der Liste selbst.
cat list.txtlogs/access.log
logs/error.log
tmp/keep.txtcat list.txt | wc -l3Mit xargs dazwischen werden die drei Namen der Liste zu Argumenten von wc, und die Zeilenzahl erscheint für jede Datei.
cat list.txt | xargs wc -l 3 logs/access.log
2 logs/error.log
1 tmp/keep.txt
6 total2️⃣ Die xargs-Optionen -n und -I
Ohne Optionen geht die gesamte Eingabe in einen einzigen Befehlsaufruf. Um den Befehl zu wiederholen, legst du mit -n fest, wie viele Argumente pro Aufruf übergeben werden. In der Abbildung unten siehst du, wie dieselben fünf Namen je nach Option gruppiert werden.
-n 1 führt echo für jeden Namen aus, es erscheinen fünf Zeilen.
cat names.txt | xargs -n 1 echoalice
bob
carol
dave
erin-n 2 bildet Zweiergruppen und übergibt den Rest separat.
cat names.txt | xargs -n 2 echoalice bob
carol dave
erinUm die ausgeführten Befehle zu sehen, fügst du -t hinzu. Zuerst erscheint die Befehlszeile, darunter die Ausgabe.
cat names.txt | xargs -t -n 2 echoecho alice bob
alice bob
echo carol dave
carol dave
echo erin
erinSoll ein Argument nicht am Ende des Befehls stehen, legst du mit -I einen Platzhalter fest. An die Stelle von {} kommt je eine Zeile, und kommt derselbe Text mehrfach vor, werden alle ersetzt.
cat names.txt | xargs -I {} echo 'user: {}'user: alice
user: bob
user: carol
user: dave
user: erincat names.txt | xargs -I {} echo '{} -> home/{}'alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erinAuf dieselbe Weise kannst du pro Name einen Ordner anlegen. Erstelle zuerst den Ordner home und lege dann mit -I {} darunter je einen Ordner pro Name an: Es entstehen fünf Ordner.
mkdir homecat names.txt | xargs -I {} mkdir home/{}ls homealice bob carol dave erin-I behandelt eine Zeile als ein Argument und lässt sich daher nicht mit -n kombinieren. Als wir beide angegeben haben, wurde -I mit einer Warnung ignoriert und {} wörtlich ausgegeben.
cat names.txt | xargs -I {} -n 2 echo {}xargs: warning: options --replace and --max-args/-n are mutually exclusive, ignoring previous --replace value
{} alice bob
{} carol dave
{} erin-L gruppiert nach Zeilenzahl. Stehen mehrere Wörter in einer Zeile, werden sie gemeinsam übergeben, und bei names.txt mit einem Namen pro Zeile lieferte -L 2 dasselbe Ergebnis wie -n 2.
cat names.txt | xargs -L 2 echoalice bob
carol dave
erin3️⃣ find und xargs kombinieren
Du musst keine Namensliste von Hand erstellen, sondern kannst die von find gefundenen Dateien direkt an xargs übergeben. Die Suche nach Dateien auf .log im Log-Ordner findet drei, und eine davon hat ein Leerzeichen im Namen.
find /root/work/logs -name '*.log'/root/work/logs/access.log
/root/work/logs/error.log
/root/work/logs/old access.logAls diese Liste unverändert an xargs wc -l ging, zerfiel der Name mit Leerzeichen in old und access.log, es gab zwei Fehlerzeilen, und die Summe betrug nur 5 Zeilen aus zwei Dateien.
find /root/work/logs -name '*.log' | xargs wc -l 3 /root/work/logs/access.log
2 /root/work/logs/error.log
wc: /root/work/logs/old: No such file or directory
wc: access.log: No such file or directory
5 total-print0 von find trennt Namen mit dem Nullzeichen statt mit dem Zeilenumbruch, und -0 von xargs teilt Argumente nur an diesem Nullzeichen. Mit beiden erscheinen die Zeilenzahlen aller drei Dateien, auch der mit Leerzeichen.
find /root/work/logs -name '*.log' -print0 | xargs -0 wc -l 3 /root/work/logs/access.log
2 /root/work/logs/error.log
1 /root/work/logs/old access.log
6 totalDie find-Option -exec erledigt dasselbe. Mit + nach {} werden die gefundenen Dateien auf einmal übergeben, das Ergebnis ist also gleich, und find gibt Leerzeichen in Dateinamen unverändert weiter. xargs nimmt auch die Ausgabe anderer Befehle an. Nutze es also, wenn die Eingabe nicht nur von find kommt oder wenn du die Anzahl pro Aufruf (-n) oder die Zahl gleichzeitiger Aufrufe (-P) festlegen musst.
find /root/work/logs -name '*.log' -exec wc -l {} + 3 /root/work/logs/access.log
2 /root/work/logs/error.log
1 /root/work/logs/old access.log
6 totalUm unter den gefundenen Dateien nur die mit einer bestimmten Zeichenkette auszuwählen, hängst du grep -l an xargs an. wp-login enthielten zwei Dateien: das Zugriffslog und das Fehlerlog.
find /root/work/logs -name '*.log' -print0 | xargs -0 grep -l wp-login/root/work/logs/access.log
/root/work/logs/error.log4️⃣ Dateien mit dem xargs-Befehl löschen
Steht rm hinter xargs, werden die gefundenen Dateien auf einmal gelöscht. Prüfe daher vor dem Löschen, welche Dateien übergeben werden. Setzt du echo vor rm, erscheint nur die Befehlszeile, die laufen würde, und die Dateien bleiben.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 echo rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmpls tmpcache-a.tmp cache-b.tmp cache-c.tmp keep.txtMit -p fragt xargs vor jedem Befehl nach. Gibst du n ein, wird nichts gelöscht und die drei temporären Dateien bleiben.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...nls tmpcache-a.tmp cache-b.tmp cache-c.tmp keep.txtGibst du y ein, werden die drei Dateien gelöscht und nur keep.txt bleibt.
find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...yls tmpkeep.txtIst die Eingabe leer, führt xargs den Befehl einmal ohne Argumente aus. Übergibst du eine leere Datei, läuft rm ohne Argumente und meldet [rm: missing operand]; mit -r läuft der Befehl gar nicht.
cat empty.txt | xargs rmrm: missing operand
Try 'rm --help' for more information.cat empty.txt | xargs -r rm5️⃣ Parallele Ausführung, Trennzeichen und Optionen von xargs
🔲 Parallele Ausführung und Trennzeichen
Laufen Befehle nacheinander, wächst die Zeit mit der Zahl der Ziele. -P legt fest, wie viele Befehle gleichzeitig laufen. Vier sleep mit 1, 2, 3 und 4 Sekunden brauchten nacheinander 10 Sekunden und gleichzeitig mit -P 4 nur die längsten 4 Sekunden.
time seq 1 4 | xargs -n 1 sleep
real 0m10.007s
user 0m0.004s
sys 0m0.003stime seq 1 4 | xargs -n 1 -P 4 sleep
real 0m4.005s
user 0m0.001s
sys 0m0.006sIst die Eingabe durch ein anderes Zeichen als Zeilenumbruch oder Leerzeichen geteilt, legst du das Trennzeichen mit -d fest. Teilst du drei mit Kommas verbundene Namen mit -d , auf, erscheint pro Name eine Zeile.
printf 'alice,bob,carol' | xargs -d , -n 1 echoalice
bob
carolUm statt aus der Standardeingabe aus einer Datei zu lesen, gibst du den Dateinamen bei -a an. Die fünf Namen aus names.txt gingen ohne Pipe an echo.
xargs -a names.txt echoalice bob carol dave erin🔲 Optionen des xargs-Befehls
📌 Wichtige Optionen: Ergebnisse aus diesem Artikel
| Option | Was es tut | Ergebnis in diesem Artikel | |
|---|---|---|---|
| -n | Legt fest, wie viele Argumente an einen Befehlsaufruf gehen | Die fünf Namen werden mit -n 2 zu zweit gruppiert, echo läuft dreimal | |
| -I | Setzt je eine Zeile in den Platzhalter und läuft pro Zeile | An die Stelle von {} kommt ein Name; zusammen mit -n wird -I mit Warnung ignoriert | |
| -L | Legt fest, wie viele Zeilen an einen Befehlsaufruf gehen | Bei einer Datei mit einem Namen pro Zeile dasselbe Ergebnis wie -n 2 | |
| -t | Gibt die auszuführende Befehlszeile zuerst aus | Die Befehlszeile erscheint vor der Ausgabe | |
| -0 | Teilt die Eingabe nur am Nullzeichen (zusammen mit find -print0) | Ohne die Option zerfallen Namen mit Leerzeichen und es gibt zwei Fehlerzeilen, mit ihr haben alle drei Dateien 6 Zeilen | |
| -p | Fragt vor jedem Befehl nach | Bei n bleiben sie, bei y werden die drei Dateien gelöscht | |
| -r | Führt den Befehl bei leerer Eingabe nicht aus | Ohne die Option [rm: missing operand], mit ihr läuft nichts | |
| -P | Legt fest, wie viele Befehle gleichzeitig laufen | Vier sleep: nacheinander 10 Sekunden, mit -P 4 nur 4 Sekunden | |
| -d | Legt das Trennzeichen für die Eingabe fest | -d , ergibt pro Name eine Zeile | |
| -a | Liest die Eingabe aus einer Datei statt aus der Standardeingabe | Die fünf Namen aus names.txt gehen an ein einziges echo |
📎 Weitere Optionen: laut offiziellem Handbuch
| Option | Was es tut | |
|---|---|---|
| -s | Legt die maximale Zeichenzahl einer Befehlszeile fest | |
| -x | Über der Größe von -s endet es, ohne auszuführen | |
| -E | Hört bei einer Zeile mit nur diesem Text auf, weitere Eingabe zu lesen | |
| -o | Öffnet das Terminal erneut als Standardeingabe des Befehls (für interaktive Programme) | |
| --process-slot-var | Setzt für jeden gleichzeitig laufenden Befehl eine andere Nummer in eine Umgebungsvariable |
🔲 xargs-Befehl-Simulator
Im Simulator unten kannst du xargs- und find-Befehle selbst auf denselben Testdateien eingeben.
🔢 FAQ & empfohlene Inhalte
Textsuche
Linux-grep-Befehl
Der grep-Befehl findet in Dateien Zeilen, die zu Zeichenketten und regulären Ausdrücken passen. Du nutzt ihn, um mehrere über xargs übergebene Dateien auf einmal zu durchsuchen.
Dateien löschen
Linux-Befehl rm
Ein Artikel über den rm-Befehl, der Dateien und Ordner löscht, und die Gefahren der Option -rf. Prüfe die Optionen, bevor du rm hinter xargs setzt.
Prozesse beenden
Linux-Befehl kill
Der kill-Befehl sendet ein Signal an eine Prozess-ID und beendet den Prozess. Du nutzt ihn als Nächstes, wenn du eine Liste von Prozess-IDs über xargs übergibst, um sie zu beenden.
ℹ️ Affiliate-Hinweis
Die Inhalte dieser Website enthalten Affiliate-Links. Kauft ein Besucher über einen dieser Links ein Produkt oder eine Dienstleistung, erhält die Website vom Verkäufer eine Provision. Der Betrag, den der Käufer zahlt(bei Aktionsrabatten sinkt er ↓), steigt dadurch nicht. Angegebene Preise, Rabatte und Lagerbestände entsprechen dem Stand bei Erstellung und können abweichen; prüfe sie daher vor dem Kauf beim Verkäufer. Produkte werden nach eigenen Kriterien ausgewählt und bewertet, und Provisionen beeinflussen weder die Reihenfolge noch den Inhalt der Bewertungen.