xargs-commando: gebruik, de opties -n en -I en combineren met find
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
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.txtalice
bob
carol
dave
erinGeef 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 echoalice bob carol dave erinZet je er geen commando achter, dan voert xargs echo uit, dus het resultaat is hetzelfde.
cat names.txt | xargsalice bob carol dave erinEen 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.txtlogs/access.log
logs/error.log
tmp/keep.txtcat list.txt | wc -l3Met 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 total2️⃣ De xargs-opties -n en -I
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.
-n 1 voert echo uit per naam, zodat er vijf regels verschijnen.
cat names.txt | xargs -n 1 echoalice
bob
carol
dave
erin-n 2 maakt groepjes van twee en geeft de rest apart door.
cat names.txt | xargs -n 2 echoalice bob
carol dave
erinOm de uitgevoerde commando's te zien, voeg je -t toe. Eerst verschijnt de commandoregel, daaronder de uitvoer.
cat names.txt | xargs -t -n 2 echoecho alice bob
alice bob
echo carol dave
carol dave
echo erin
erinMoet 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: erincat names.txt | xargs -I {} echo '{} -> home/{}'alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erinZo 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 homecat names.txt | xargs -I {} mkdir home/{}ls homealice 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 echoalice bob
carol dave
erin3️⃣ find en xargs combineren
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.logToen 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 totalDe 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 totalOm 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.log4️⃣ Bestanden verwijderen met het xargs-commando
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 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.txtMet -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 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.txtVoer 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 rmrm /root/work/tmp/cache-a.tmp /root/work/tmp/cache-b.tmp /root/work/tmp/cache-c.tmp?...yls tmpkeep.txtIs 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 rmrm: missing operand
Try 'rm --help' for more information.cat empty.txt | xargs -r rm5️⃣ Parallel uitvoeren, scheidingstekens en opties van xargs
🔲 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.003stime seq 1 4 | xargs -n 1 -P 4 sleep
real 0m4.005s
user 0m0.001s
sys 0m0.006sIs 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 echoalice
bob
carolOm 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 echoalice bob carol dave erin🔲 Opties van het xargs-commando
📌 Belangrijkste opties: resultaten uit dit artikel
| Optie | Taak | Resultaat in dit artikel | |
|---|---|---|---|
| -n | Bepaalt hoeveel argumenten naar één uitvoering van het commando gaan | De vijf namen worden met -n 2 per twee gegroepeerd en echo draait drie keer | |
| -I | Zet telkens één regel in de plaatshouder en draait per regel | Op de plek van {} komt een naam; samen met -n wordt -I met een waarschuwing genegeerd | |
| -L | Bepaalt hoeveel regels naar één uitvoering van het commando gaan | Bij een bestand met één naam per regel hetzelfde resultaat als -n 2 | |
| -t | Toont eerst de uit te voeren commandoregel | De commandoregel verschijnt vóór de uitvoer | |
| -0 | Splitst 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 | |
| -p | Vraagt per commando of het moet worden uitgevoerd | Bij n blijven ze staan, bij y worden de drie bestanden verwijderd | |
| -r | Voert het commando niet uit als de invoer leeg is | Zonder de optie [rm: missing operand], met de optie draait er niets | |
| -P | Bepaalt hoeveel commando's tegelijk draaien | Vier sleep-commando's: na elkaar 10 seconden, met -P 4 maar 4 seconden | |
| -d | Bepaalt het scheidingsteken voor de invoer | -d , geeft één regel per naam | |
| -a | Leest invoer uit een bestand in plaats van de standaardinvoer | De vijf namen uit names.txt gaan naar één echo |
📎 Andere opties: volgens de officiële handleiding
| Optie | Taak | |
|---|---|---|
| -s | Bepaalt het maximale aantal tekens op een commandoregel | |
| -x | Boven de grootte van -s stopt het zonder uit te voeren | |
| -E | Stopt met het lezen van invoer bij een regel met alleen deze tekst | |
| -o | Opent de terminal opnieuw als standaardinvoer van het commando (voor interactieve programma's) | |
| --process-slot-var | Zet 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.
🔢 FAQ & aanbevolen content
Tekst zoeken
Linux grep-commando
Het grep-commando vindt in bestanden regels die overeenkomen met tekst en reguliere expressies. Je gebruikt het om meerdere via xargs doorgegeven bestanden in één keer te doorzoeken.
Bestanden verwijderen
Linux-commando rm
Een artikel over het rm-commando, dat bestanden en mappen verwijdert, en de gevaren van de optie -rf. Controleer de opties voordat je rm achter xargs zet.
Processen beëindigen
Linux-commando kill
Het kill-commando stuurt een signaal naar een proces-ID om het te beëindigen. Je gebruikt het hierna als je een lijst met proces-ID's via xargs doorgeeft om ze te beëindigen.
ℹ️ 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.