xargs-Befehl: Verwendung, die Optionen -n und -I und Einsatz mit find

TestumgebungRHEL-FamilieAlmaLinux 9.8root-KontoGeprüft am 2026-10-29

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

  • ↪️ Standardeingabe als Befehlsargumente

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.txt
alice
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 echo
alice bob carol dave erin

Schreibst du keinen Befehl dahinter, führt xargs echo aus, das Ergebnis ist also gleich.

cat names.txt | xargs
alice bob carol dave erin

Eine 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.txt
logs/access.log
logs/error.log
tmp/keep.txt
cat list.txt | wc -l
3

Mit 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 total

2️⃣ Die xargs-Optionen -n und -I

  • ↪️ Gruppengröße, Argumentposition und Prüfen mit -t

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.

🧩 Wie xargs die Standardeingabe zu Befehlsargumenten gruppiert
Erklär-Diagramm
⚙️ Option
$ cat names.txt | xargs echo
$ cat names.txt | xargs -n 2 echo
$ cat names.txt | xargs -I {} echo 'user: {}'
① Standardeingabe (names.txt)alicebobcaroldaveerinEin Name pro Zeile, fünf Zeilen.
② Zu Argumenten gruppierenalicebobcaroldaveerinOhne Optionen bilden die fünf eine Gruppe.alicebobcaroldaveerin-n 2 bildet Zweiergruppen, der Rest kommt in eine eigene Gruppe.alicebobcaroldaveerin-I {} macht jede Zeile zu einer Gruppe und setzt sie an die Stelle von {}.
③ Ausgeführte Befehle und Ausgabeecho alice bob carol dave erinalice bob carol dave erinecho läuft einmal.echo alice bobecho carol daveecho erinecho läuft dreimal, pro Gruppe erscheint eine Zeile.echo 'user: alice' echo 'user: bob' … fünfmal in derselben Form bis erinuser: aliceuser: bobuser: caroluser: daveuser: erinecho läuft fünfmal, an die Stelle von {} kommt ein Name.
Ohne Optionen hängt xargs alle aus der Eingabe gelesenen Wörter als Argumente an einen einzigen Befehlsaufruf. Die fünf Namen gehen an ein echo und erscheinen in einer Zeile.
Mit -n 2 werden Wörter zu zweit gruppiert und der Befehl wiederholt. Die fünf Namen bilden drei Gruppen, echo läuft also dreimal.
Mit -I {} gilt eine Zeile als Einheit, sie wird an die Stelle von {} im Befehl gesetzt, und der Befehl läuft pro Zeile. Das nutzt du, wenn ein Argument nicht ganz am Ende stehen soll.

-n 1 führt echo für jeden Namen aus, es erscheinen fünf Zeilen.

cat names.txt | xargs -n 1 echo
alice
bob
carol
dave
erin

-n 2 bildet Zweiergruppen und übergibt den Rest separat.

cat names.txt | xargs -n 2 echo
alice bob
carol dave
erin

Um 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 echo
echo alice bob
alice bob
echo carol dave
carol dave
echo erin
erin

Soll 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: erin
cat names.txt | xargs -I {} echo '{} -> home/{}'
alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erin

Auf 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 home
cat names.txt | xargs -I {} mkdir home/{}
ls home
alice  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 echo
alice bob
carol dave
erin

3️⃣ find und xargs kombinieren

  • ↪️ Dateinamen mit Leerzeichen mit -print0 und -0 übergeben

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.log

Als 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 total

Die 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 total

Um 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.log

4️⃣ Dateien mit dem xargs-Befehl löschen

  • ↪️ Erst mit echo ansehen, dann mit -p bestätigen

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 rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

Mit -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 rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...n
ls tmp
cache-a.tmp  cache-b.tmp  cache-c.tmp  keep.txt

Gibst du y ein, werden die drei Dateien gelöscht und nur keep.txt bleibt.

find /root/work/tmp -name '*.tmp' -print0 | xargs -0 -p rm
rm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...y
ls tmp
keep.txt

Ist 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 rm
rm: missing operand
Try 'rm --help' for more information.
cat empty.txt | xargs -r rm

5️⃣ Parallele Ausführung, Trennzeichen und Optionen von xargs

  • ↪️ Die Optionen -P, -d und -a

🔲 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.003s
time seq 1 4 | xargs -n 1 -P 4 sleep

real	0m4.005s
user	0m0.001s
sys	0m0.006s

Ist 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 echo
alice
bob
carol

Um 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 echo
alice bob carol dave erin

🔲 Optionen des xargs-Befehls

📌 Wichtige Optionen: Ergebnisse aus diesem Artikel

OptionWas es tutErgebnis in diesem Artikel
-nLegt fest, wie viele Argumente an einen Befehlsaufruf gehenDie fünf Namen werden mit -n 2 zu zweit gruppiert, echo läuft dreimal
-ISetzt je eine Zeile in den Platzhalter und läuft pro ZeileAn die Stelle von {} kommt ein Name; zusammen mit -n wird -I mit Warnung ignoriert
-LLegt fest, wie viele Zeilen an einen Befehlsaufruf gehenBei einer Datei mit einem Namen pro Zeile dasselbe Ergebnis wie -n 2
-tGibt die auszuführende Befehlszeile zuerst ausDie Befehlszeile erscheint vor der Ausgabe
-0Teilt 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
-pFragt vor jedem Befehl nachBei n bleiben sie, bei y werden die drei Dateien gelöscht
-rFührt den Befehl bei leerer Eingabe nicht ausOhne die Option [rm: missing operand], mit ihr läuft nichts
-PLegt fest, wie viele Befehle gleichzeitig laufenVier sleep: nacheinander 10 Sekunden, mit -P 4 nur 4 Sekunden
-dLegt das Trennzeichen für die Eingabe fest-d , ergibt pro Name eine Zeile
-aLiest die Eingabe aus einer Datei statt aus der StandardeingabeDie fünf Namen aus names.txt gehen an ein einziges echo

📎 Weitere Optionen: laut offiziellem Handbuch

OptionWas es tut
-sLegt die maximale Zeichenzahl einer Befehlszeile fest
-xÜber der Größe von -s endet es, ohne auszuführen
-EHö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-varSetzt 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.

xargs-Befehl-SimulatorGNU findutils 4.8
[root@server work]#
Mit den Tasten ↑↓ holst du zuvor eingegebene Befehle zurück.

🔢 FAQ & empfohlene Inhalte

Übergibst du eine Prozess-ID, sendet kill ein Signal an diese ID. Als wir die Prozess-ID eines im Hintergrund laufenden sleep 600 mit der Shell-Variable $! geholt und an xargs kill übergeben haben, stand [Terminated sleep 600] in der Jobliste und beim nächsten jobs war der Job weg. Sammelst du IDs mit einem anderen Befehl, gib die betroffenen Prozesse vor dem Übergeben erst aus.

Die Option --show-limits gibt die Grenzen aus. Auf dem getesteten Server lag die POSIX-Obergrenze der Befehlszeilenlänge bei 2,093,890 Byte, und der tatsächlich von xargs genutzte Befehlspuffer bei 131,072 Byte. Laut Handbuch teilt xargs den Befehl auf mehrere Aufrufe auf, wenn die Eingabe länger als dieser Puffer ist.

Schlägt auch nur einer der von xargs ausgeführten Befehle mit einem Code von 1 bis 125 fehl, ist der Exit-Code von xargs 123. Sowohl der wc-Aufruf mit dem zerlegten Dateinamen als auch rm mit leerer Eingabe ergaben 123, ein nicht gefundener Befehl ergab 127. Nimm diese Werte als Maßstab, wenn du in Shell-Skripten den Exit-Code nach xargs prüfst.

ℹ️ 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Beweisen Sie, dass Sie ein Mensch sind: 10   +   7   =