xargs-commando: gebruik, de opties -n en -I en combineren met find

TestomgevingRHEL-familieAlmaLinux 9.8root-accountGecontroleerd op 2026-10-29

Het xargs-commando is een Linux-tool die regels en woorden van de standaardinvoer omzet in argumenten voor een ander commando en dat commando uitvoert. Toen we in een werkmap op een AlmaLinux 9-server drie door find gevonden logbestanden met xargs aan wc doorgaven, werd één bestand met een spatie in de naam in tweeën gesplitst en gaf dat een fout, en met -print0 en -0 verschenen de regelaantallen van alle drie de bestanden.

De uitvoer hieronder komt uit een werkmap onder het root-account op een AlmaLinux 9.8-server. De namenlijst, logs en tijdelijke bestanden zijn voorbeeldbestanden die voor de test zijn gemaakt, en de IP-adressen en mappaden daarin zijn ook voorbeeldwaarden.

1️⃣ Basisgebruik van het xargs-commando

  • ↪️ Standaardinvoer als argumenten van een commando

xargs splitst de standaardinvoer van het vorige commando op spaties en regeleinden en voert het commando erachter uit met die delen als argumenten. We hebben dit gecontroleerd met names.txt, met één naam per regel.

cat names.txt
alice
bob
carol
dave
erin

Geef je de uitvoer van cat door aan xargs echo, dan worden de vijf regels argumenten van één echo en verschijnen ze op één regel.

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

Zet je er geen commando achter, dan voert xargs echo uit, dus het resultaat is hetzelfde.

cat names.txt | xargs
alice bob carol dave erin

Een pipe verbindt de uitvoer van het vorige commando met de standaardinvoer van het volgende, dus in de argumenten van het volgende commando komt niets. Geef je list.txt met drie bestandsnamen alleen via een pipe door aan wc -l, dan telt wc de 3 regels van de lijst zelf.

cat list.txt
logs/access.log
logs/error.log
tmp/keep.txt
cat list.txt | wc -l
3

Met xargs ertussen worden de drie namen in de lijst argumenten van wc en verschijnt het regelaantal per bestand.

cat list.txt | xargs wc -l
  3 logs/access.log
  2 logs/error.log
  1 tmp/keep.txt
  6 total

2️⃣ De xargs-opties -n en -I

  • ↪️ Groepsgrootte, argumentpositie en controleren met -t

Zonder opties gaat alle invoer naar één uitvoering van het commando. Om het commando te herhalen, bepaal je met -n hoeveel argumenten per keer worden doorgegeven. In de afbeelding hieronder zie je hoe dezelfde vijf namen per optie worden gegroepeerd.

🧩 Hoe xargs standaardinvoer groepeert tot argumenten van een commando
Uitlegdiagram
⚙️ Optie
$ cat names.txt | xargs echo
$ cat names.txt | xargs -n 2 echo
$ cat names.txt | xargs -I {} echo 'user: {}'
① Standaardinvoer (names.txt)alicebobcaroldaveerinEén naam per regel, vijf regels.
② Groeperen tot argumentenalicebobcaroldaveerinZonder opties vormen de vijf één groep.alicebobcaroldaveerin-n 2 maakt groepjes van twee en de rest komt in een eigen groep.alicebobcaroldaveerin-I {} maakt van één regel één groep en zet die op de plek van {}.
③ Uitgevoerde commando's en uitvoerecho alice bob carol dave erinalice bob carol dave erinecho draait één keer.echo alice bobecho carol daveecho erinecho draait drie keer, met één regel per groep.echo 'user: alice' echo 'user: bob' … vijf keer in dezelfde vorm tot en met erinuser: aliceuser: bobuser: caroluser: daveuser: erinecho draait vijf keer, met een naam op de plek van {}.
Zonder opties hangt xargs alle woorden uit de invoer als argumenten aan één uitvoering van het commando. De vijf namen gaan naar één echo en verschijnen op één regel.
Met -n 2 worden woorden per twee gegroepeerd en wordt het commando herhaald. De vijf namen vormen drie groepen, dus echo draait drie keer.
Met -I {} telt één regel als één geheel en komt die regel op de plek van {} in het commando, dat per regel draait. Dit gebruik je als een argument niet helemaal achteraan moet staan.

-n 1 voert echo uit per naam, zodat er vijf regels verschijnen.

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

-n 2 maakt groepjes van twee en geeft de rest apart door.

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

Om de uitgevoerde commando's te zien, voeg je -t toe. Eerst verschijnt de commandoregel, daaronder de uitvoer.

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

Moet een argument niet aan het eind van het commando staan, bepaal dan met -I een plaatshouder. Op de plek van {} komt telkens één regel, en komt dezelfde tekst vaker voor, dan worden ze allemaal vervangen.

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

Zo kun je ook per naam een map maken. Maak eerst de map home en maak daaronder met -I {} een map per naam: er ontstaan vijf mappen.

mkdir home
cat names.txt | xargs -I {} mkdir home/{}
ls home
alice  bob  carol  dave  erin

-I behandelt één regel als één argument en kan dus niet samen met -n. Toen we beide opgaven, werd -I met een waarschuwing genegeerd en werd {} letterlijk getoond.

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 groepeert op aantal regels. Staan er meerdere woorden op een regel, dan gaan die samen mee, en in names.txt met één naam per regel gaf -L 2 hetzelfde resultaat als -n 2.

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

3️⃣ find en xargs combineren

  • ↪️ Bestandsnamen met spaties doorgeven met -print0 en -0

Je hoeft geen namenlijst met de hand te maken: je kunt de door find gevonden bestanden direct aan xargs doorgeven. Zoeken naar bestanden op .log in de logmap levert er drie op, en één daarvan heeft een spatie in de naam.

find /root/work/logs -name '*.log'
/root/work/logs/access.log
/root/work/logs/error.log
/root/work/logs/old access.log

Toen deze lijst ongewijzigd naar xargs wc -l ging, viel de naam met de spatie uiteen in old en access.log, verschenen er twee foutregels en was het totaal maar 5 regels uit twee bestanden.

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 van find scheidt namen met het null-teken in plaats van een regeleinde, en -0 van xargs splitst argumenten alleen op dat null-teken. Met beide verschijnen de regelaantallen van alle drie de bestanden, ook dat met de spatie.

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

De find-optie -exec doet hetzelfde. Met + na {} worden de gevonden bestanden in één keer doorgegeven, dus het resultaat is gelijk, en find geeft spaties in bestandsnamen ongewijzigd door. xargs accepteert ook uitvoer van andere commando's. Gebruik het dus als de invoer niet alleen van find komt, of als je het aantal per keer (-n) of het aantal gelijktijdige uitvoeringen (-P) moet bepalen.

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

Om van de gevonden bestanden alleen die met een bepaalde tekst te kiezen, zet je grep -l achter xargs. wp-login stond in twee bestanden: het toegangslog en het foutlog.

find /root/work/logs -name '*.log' -print0 | xargs -0 grep -l wp-login
/root/work/logs/access.log
/root/work/logs/error.log

4️⃣ Bestanden verwijderen met het xargs-commando

  • ↪️ Eerst bekijken met echo en bevestigen met -p

Met rm achter xargs worden de gevonden bestanden in één keer verwijderd, dus controleer eerst welke bestanden worden doorgegeven. Zet je echo vóór rm, dan verschijnt alleen de commandoregel die zou draaien en blijven de bestanden staan.

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

Met -p vraagt xargs per commando of het moet worden uitgevoerd. Voer je n in, dan wordt niets verwijderd en blijven de drie tijdelijke bestanden staan.

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

Voer je y in, dan worden de drie bestanden verwijderd en blijft alleen keep.txt over.

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

Is de invoer leeg, dan voert xargs het commando één keer zonder argumenten uit. Geef je een leeg bestand door, dan draait rm zonder argumenten en krijg je de fout [rm: missing operand]; met -r draait het commando helemaal niet.

cat empty.txt | xargs rm
rm: missing operand
Try 'rm --help' for more information.
cat empty.txt | xargs -r rm

5️⃣ Parallel uitvoeren, scheidingstekens en opties van xargs

  • ↪️ De opties -P, -d en -a

🔲 Parallel uitvoeren en scheidingstekens

Draaien commando's één voor één, dan loopt de tijd op met het aantal doelen. -P bepaalt hoeveel commando's tegelijk draaien. Vier sleep-commando's van 1, 2, 3 en 4 seconden duurden na elkaar 10 seconden, en waren tegelijk met -P 4 klaar in de langste 4 seconden.

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

Is de invoer gescheiden door een ander teken dan een regeleinde of spatie, bepaal dan het scheidingsteken met -d. Splits je drie met komma's verbonden namen met -d , dan verschijnt er één regel per naam.

printf 'alice,bob,carol' | xargs -d , -n 1 echo
alice
bob
carol

Om uit een bestand te lezen in plaats van de standaardinvoer, geef je de bestandsnaam op bij -a. De vijf namen uit names.txt gingen zonder pipe naar echo.

xargs -a names.txt echo
alice bob carol dave erin

🔲 Opties van het xargs-commando

📌 Belangrijkste opties: resultaten uit dit artikel

OptieTaakResultaat in dit artikel
-nBepaalt hoeveel argumenten naar één uitvoering van het commando gaanDe vijf namen worden met -n 2 per twee gegroepeerd en echo draait drie keer
-IZet telkens één regel in de plaatshouder en draait per regelOp de plek van {} komt een naam; samen met -n wordt -I met een waarschuwing genegeerd
-LBepaalt hoeveel regels naar één uitvoering van het commando gaanBij een bestand met één naam per regel hetzelfde resultaat als -n 2
-tToont eerst de uit te voeren commandoregelDe commandoregel verschijnt vóór de uitvoer
-0Splitst invoer alleen op het null-teken (samen met find -print0)Zonder de optie vallen namen met spaties uiteen met twee foutregels; met de optie hebben alle drie de bestanden 6 regels
-pVraagt per commando of het moet worden uitgevoerdBij n blijven ze staan, bij y worden de drie bestanden verwijderd
-rVoert het commando niet uit als de invoer leeg isZonder de optie [rm: missing operand], met de optie draait er niets
-PBepaalt hoeveel commando's tegelijk draaienVier sleep-commando's: na elkaar 10 seconden, met -P 4 maar 4 seconden
-dBepaalt het scheidingsteken voor de invoer-d , geeft één regel per naam
-aLeest invoer uit een bestand in plaats van de standaardinvoerDe vijf namen uit names.txt gaan naar één echo

📎 Andere opties: volgens de officiële handleiding

OptieTaak
-sBepaalt het maximale aantal tekens op een commandoregel
-xBoven de grootte van -s stopt het zonder uit te voeren
-EStopt met het lezen van invoer bij een regel met alleen deze tekst
-oOpent de terminal opnieuw als standaardinvoer van het commando (voor interactieve programma's)
--process-slot-varZet per gelijktijdig commando een ander nummer in een omgevingsvariabele

🔲 Simulator van het xargs-commando

In de simulator hieronder kun je zelf xargs- en find-commando's invoeren op dezelfde testbestanden.

Simulator van het xargs-commandoGNU findutils 4.8
[root@server work]#
Met de toetsen ↑↓ haal je eerder ingetypte commando's terug.

🔢 FAQ & aanbevolen content

Geef je een proces-ID door, dan stuurt kill een signaal naar dat ID. Toen we het proces-ID van een sleep 600 op de achtergrond met de shellvariabele $! ophaalden en aan xargs kill doorgaven, stond [Terminated sleep 600] in de takenlijst en was de taak bij de volgende jobs verdwenen. Verzamel je ID's met een ander commando, toon dan eerst welke processen erbij horen voordat je ze doorgeeft.

De optie --show-limits toont de grenzen. Op de geteste server was de POSIX-bovengrens voor de lengte van een commandoregel 2,093,890 bytes, en de commandobuffer die xargs echt gebruikt 131,072 bytes. Volgens de handleiding verdeelt xargs het commando over meerdere uitvoeringen als de invoer langer is dan deze buffer.

Mislukt ook maar één door xargs uitgevoerd commando met een code van 1 tot en met 125, dan is de exitcode van xargs 123. Zowel de wc-uitvoering met de gesplitste bestandsnaam als rm met lege invoer gaven 123, en een niet gevonden commando gaf 127. Gebruik deze waarden als je in shellscripts de exitcode na xargs controleert.

ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Laat zien dat je geen machine bent: 3   +   8   =