Comando xargs: uso, opzioni -n e -I e utilizzo con find

Ambiente di testFamiglia RHELAlmaLinux 9.8account rootVerificato il 2026-10-29

Il comando xargs è uno strumento Linux che trasforma le righe e le parole ricevute dallo standard input in argomenti di un altro comando e lo esegue. Passando con xargs a wc tre file di log trovati da find in una cartella di lavoro di un server AlmaLinux 9, un file con uno spazio nel nome è stato diviso in due causando un errore, e con -print0 e -0 sono comparsi i conteggi delle righe di tutti e tre i file.

L'output qui sotto è stato ottenuto in una cartella di lavoro con l'account root di un server AlmaLinux 9.8. L'elenco di nomi, i log e i file temporanei sono file di esempio creati per il test, e gli indirizzi IP e i percorsi delle cartelle al loro interno sono anch'essi valori di esempio.

1️⃣ Uso di base del comando xargs

  • ↪️ Lo standard input come argomenti del comando

xargs divide lo standard input passato dal comando precedente in base a spazi e ritorni a capo, ed esegue il comando scritto dopo con quelle parti come argomenti. Lo abbiamo verificato con names.txt, che ha un nome per riga.

cat names.txt
alice
bob
carol
dave
erin

Se passi l'output di cat a xargs echo, le cinque righe diventano argomenti di un solo echo e compaiono su una riga.

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

Se non scrivi nessun comando dopo, xargs esegue echo, quindi il risultato è lo stesso.

cat names.txt | xargs
alice bob carol dave erin

Una pipe collega l'output del comando precedente allo standard input di quello successivo, quindi negli argomenti del comando successivo non entra nulla. Se passi solo tramite pipe a wc -l il file list.txt, che contiene tre nomi di file, wc conta le 3 righe dell'elenco stesso.

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

Con xargs in mezzo, i tre nomi dell'elenco diventano argomenti di wc e compare il conteggio delle righe di ogni file.

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

2️⃣ Opzioni -n e -I di xargs

  • ↪️ Dimensione del gruppo, posizione dell'argomento e controllo con -t

Senza opzioni, tutto l'input finisce in una sola esecuzione del comando. Per ripeterlo, stabilisci con -n quanti argomenti passare ogni volta. Nella figura qui sotto vedi come gli stessi cinque nomi vengono raggruppati a seconda dell'opzione.

🧩 Come xargs raggruppa lo standard input in argomenti del comando
Diagramma esplicativo
⚙️ Opzione
$ cat names.txt | xargs echo
$ cat names.txt | xargs -n 2 echo
$ cat names.txt | xargs -I {} echo 'user: {}'
① Standard input (names.txt)alicebobcaroldaveerinUn nome per riga, cinque righe.
② Raggruppare in argomentialicebobcaroldaveerinSenza opzioni, i cinque formano un gruppo.alicebobcaroldaveerin-n 2 raggruppa a due a due e mette quello rimasto in un gruppo a sé.alicebobcaroldaveerin-I {} considera una riga come un gruppo e la mette al posto di {}.
③ Comandi eseguiti e outputecho alice bob carol dave erinalice bob carol dave erinecho viene eseguito una volta.echo alice bobecho carol daveecho erinecho viene eseguito tre volte, con una riga per gruppo.echo 'user: alice' echo 'user: bob' … cinque volte nella stessa forma fino a erinuser: aliceuser: bobuser: caroluser: daveuser: erinecho viene eseguito cinque volte, con un nome al posto di {}.
Senza opzioni, xargs aggiunge tutte le parole lette dall'input come argomenti di una sola esecuzione. I cinque nomi vanno a un solo echo e compaiono su una riga.
Con -n 2, le parole vengono raggruppate a due a due e il comando viene ripetuto. I cinque nomi formano tre gruppi, quindi echo viene eseguito tre volte.
Con -I {}, una riga conta come un'unità e prende il posto di {} nel comando, che viene eseguito per ogni riga. Si usa quando l'argomento deve stare in un punto diverso dalla fine.

-n 1 esegue echo per ogni nome e compaiono cinque righe.

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

-n 2 raggruppa a due a due e passa a parte quello rimasto.

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

Per vedere i comandi eseguiti, aggiungi -t. Prima compare la riga di comando, poi sotto il suo output.

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

Se l'argomento deve stare in un punto diverso dalla fine del comando, imposta un segnaposto con -I. Al posto di {} entra una riga alla volta, e se lo stesso testo compare più volte vengono sostituiti tutti.

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

Allo stesso modo puoi creare una cartella per nome. Crea prima la cartella home e poi usa -I {} per creare al suo interno una cartella per nome: compaiono cinque cartelle.

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

-I tratta una riga come un argomento, quindi non si può usare con -n. Scrivendole entrambe, -I è stata ignorata con un avviso e {} è stato stampato alla lettera.

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 raggruppa per numero di righe. Se una riga contiene più parole, vengono passate insieme, e in names.txt, con un nome per riga, -L 2 ha dato lo stesso risultato di -n 2.

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

3️⃣ Combinazione di find e xargs

  • ↪️ Passare nomi di file con spazi usando -print0 e -0

Non serve creare a mano un elenco di nomi: puoi passare direttamente a xargs i file trovati da find. Cercando i file che finiscono in .log nella cartella dei log se ne trovano tre, e uno ha uno spazio nel nome.

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

Passando questo elenco così com'è a xargs wc -l, il nome con lo spazio si è diviso in old e access.log, sono comparse due righe di errore e il totale è stato di 5 righe, sommando solo due file.

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 di find separa i nomi con il carattere nullo invece del ritorno a capo, e -0 di xargs divide gli argomenti solo su quel carattere nullo. Con entrambe compaiono i conteggi di tutti e tre i file, compreso quello con lo spazio.

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

L'opzione -exec di find fa lo stesso lavoro. Con + dopo {}, i file trovati vengono passati tutti insieme, quindi il risultato è uguale, e find trasmette così come sono gli spazi dei nomi. xargs accetta anche l'output di altri comandi: usalo quando l'input non viene solo da find, o quando devi stabilire quanti elementi passare ogni volta (-n) o quanti eseguirne insieme (-P).

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

Per scegliere solo i file trovati che contengono una stringa, aggiungi grep -l dopo xargs. I file con wp-login erano due: il log di accesso e il log degli errori.

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

4️⃣ Eliminare file con il comando xargs

  • ↪️ Vedere prima con echo e confermare con -p

Con rm dopo xargs, i file trovati vengono eliminati tutti insieme, quindi controlla prima quali file verranno passati. Con echo davanti a rm compare solo la riga di comando che verrebbe eseguita e i file restano al loro posto.

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

Con -p, xargs chiede se eseguire ogni comando. Se inserisci n non viene eliminato nulla e i tre file temporanei restano.

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

Se inserisci y, i tre file vengono eliminati e resta solo keep.txt.

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

Se l'input è vuoto, xargs esegue il comando una volta senza argomenti. Passando un file vuoto, rm viene eseguito senza argomenti e dà l'errore [rm: missing operand]; con -r il comando non viene eseguito affatto.

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

5️⃣ Esecuzione parallela, delimitatori e opzioni di xargs

  • ↪️ Opzioni -P, -d e -a

🔲 Esecuzione parallela e delimitatori

Quando i comandi vengono eseguiti uno alla volta, il tempo cresce con il numero di obiettivi. -P stabilisce quanti comandi eseguire insieme. Quattro sleep da 1, 2, 3 e 4 secondi hanno richiesto 10 secondi in sequenza e sono finiti in 4 secondi, il più lungo, insieme con -P 4.

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

Se l'input è diviso da un simbolo diverso da ritorno a capo o spazio, imposta il delimitatore con -d. Dividendo con -d , tre nomi uniti da virgole compare una riga per nome.

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

Per leggere da un file invece che dallo standard input, scrivi il nome del file in -a. I cinque nomi di names.txt sono passati a echo senza pipe.

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

🔲 Opzioni del comando xargs

📌 Opzioni principali: risultati di questo articolo

OpzioneCompitoRisultato in questo articolo
-nStabilisce quanti argomenti passare a un'esecuzione del comandoI cinque nomi vengono raggruppati a due a due con -n 2 ed echo viene eseguito tre volte
-IMette una riga alla volta nel segnaposto ed esegue per rigaUn nome prende il posto di {}; scritta con -n, -I viene ignorata con un avviso
-LStabilisce quante righe passare a un'esecuzione del comandoIn un file con un nome per riga, stesso risultato di -n 2
-tStampa prima la riga di comando da eseguireLa riga di comando compare prima dell'output
-0Divide l'input solo sul carattere nullo (con find -print0)Senza, i nomi con spazi si dividono e compaiono due righe di errore; con essa, tutti e tre i file danno 6 righe
-pChiede se eseguire ogni comandoCon n restano; con y i tre file vengono eliminati
-rNon esegue il comando se l'input è vuotoSenza, [rm: missing operand]; con essa, non viene eseguito nulla
-PStabilisce quanti comandi eseguire insiemeQuattro sleep: 10 secondi in sequenza, 4 secondi con -P 4
-dImposta il delimitatore che divide l'input-d , dà una riga per nome
-aLegge l'input da un file invece che dallo standard inputI cinque nomi di names.txt vanno a un solo echo

📎 Altre opzioni: secondo il manuale ufficiale

OpzioneCompito
-sStabilisce il massimo di caratteri di una riga di comando
-xOltre la dimensione di -s termina senza eseguire
-ESmette di leggere l'input quando trova una riga con solo questo testo
-oRiapre il terminale come standard input del comando (per programmi interattivi)
--process-slot-varMette un numero diverso in una variabile d'ambiente per ogni comando simultaneo

🔲 Simulatore del comando xargs

Nel simulatore qui sotto puoi digitare comandi xargs e find sugli stessi file di prova.

Simulatore del comando xargsGNU findutils 4.8
[root@server work]#
Con i tasti ↑↓ richiami i comandi digitati prima.

🔢 FAQ & contenuti consigliati

Se passi un numero di processo, kill invia un segnale a quel numero. Prendendo con la variabile della shell $! il numero di uno sleep 600 in background e passandolo a xargs kill, nell'elenco dei job è rimasto [Terminated sleep 600] e al jobs successivo il job era sparito. Quando raccogli i numeri con un altro comando, stampa prima quali processi sono inclusi e poi passali.

L'opzione --show-limits stampa i limiti. Sul server di prova, il limite POSIX della lunghezza della riga di comando era di 2,093,890 byte, e il buffer di comando realmente usato da xargs di 131,072 byte. Secondo il manuale, se l'input supera questo buffer, xargs divide il comando in più esecuzioni.

Se anche uno solo dei comandi eseguiti da xargs fallisce con un codice da 1 a 125, il codice di uscita di xargs è 123. Sia il wc con il nome di file diviso sia rm con input vuoto hanno dato 123, e un comando non trovato ha dato 127. Usa questi valori come riferimento quando controlli il codice di uscita dopo xargs negli script di shell.

ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Dimostra di essere umano: 4   +   6   =