Comando xargs: uso, opzioni -n e -I e utilizzo con find
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
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.txtalice
bob
carol
dave
erinSe 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 echoalice bob carol dave erinSe non scrivi nessun comando dopo, xargs esegue echo, quindi il risultato è lo stesso.
cat names.txt | xargsalice bob carol dave erinUna 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.txtlogs/access.log
logs/error.log
tmp/keep.txtcat list.txt | wc -l3Con 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 total2️⃣ Opzioni -n e -I di xargs
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.
-n 1 esegue echo per ogni nome e compaiono cinque righe.
cat names.txt | xargs -n 1 echoalice
bob
carol
dave
erin-n 2 raggruppa a due a due e passa a parte quello rimasto.
cat names.txt | xargs -n 2 echoalice bob
carol dave
erinPer vedere i comandi eseguiti, aggiungi -t. Prima compare la riga di comando, poi sotto il suo output.
cat names.txt | xargs -t -n 2 echoecho alice bob
alice bob
echo carol dave
carol dave
echo erin
erinSe 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: erincat names.txt | xargs -I {} echo '{} -> home/{}'alice -> home/alice
bob -> home/bob
carol -> home/carol
dave -> home/dave
erin -> home/erinAllo 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 homecat names.txt | xargs -I {} mkdir home/{}ls homealice 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 echoalice bob
carol dave
erin3️⃣ Combinazione di find e xargs
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.logPassando 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 totalL'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 totalPer 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.log4️⃣ Eliminare file con il comando xargs
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 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.txtCon -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 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.txtSe inserisci y, i tre file vengono eliminati e resta solo keep.txt.
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.txtSe 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 rmrm: missing operand
Try 'rm --help' for more information.cat empty.txt | xargs -r rm5️⃣ Esecuzione parallela, delimitatori e opzioni di xargs
🔲 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.003stime seq 1 4 | xargs -n 1 -P 4 sleep
real 0m4.005s
user 0m0.001s
sys 0m0.006sSe 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 echoalice
bob
carolPer 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 echoalice bob carol dave erin🔲 Opzioni del comando xargs
📌 Opzioni principali: risultati di questo articolo
| Opzione | Compito | Risultato in questo articolo | |
|---|---|---|---|
| -n | Stabilisce quanti argomenti passare a un'esecuzione del comando | I cinque nomi vengono raggruppati a due a due con -n 2 ed echo viene eseguito tre volte | |
| -I | Mette una riga alla volta nel segnaposto ed esegue per riga | Un nome prende il posto di {}; scritta con -n, -I viene ignorata con un avviso | |
| -L | Stabilisce quante righe passare a un'esecuzione del comando | In un file con un nome per riga, stesso risultato di -n 2 | |
| -t | Stampa prima la riga di comando da eseguire | La riga di comando compare prima dell'output | |
| -0 | Divide 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 | |
| -p | Chiede se eseguire ogni comando | Con n restano; con y i tre file vengono eliminati | |
| -r | Non esegue il comando se l'input è vuoto | Senza, [rm: missing operand]; con essa, non viene eseguito nulla | |
| -P | Stabilisce quanti comandi eseguire insieme | Quattro sleep: 10 secondi in sequenza, 4 secondi con -P 4 | |
| -d | Imposta il delimitatore che divide l'input | -d , dà una riga per nome | |
| -a | Legge l'input da un file invece che dallo standard input | I cinque nomi di names.txt vanno a un solo echo |
📎 Altre opzioni: secondo il manuale ufficiale
| Opzione | Compito | |
|---|---|---|
| -s | Stabilisce il massimo di caratteri di una riga di comando | |
| -x | Oltre la dimensione di -s termina senza eseguire | |
| -E | Smette di leggere l'input quando trova una riga con solo questo testo | |
| -o | Riapre il terminale come standard input del comando (per programmi interattivi) | |
| --process-slot-var | Mette 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.
🔢 FAQ & contenuti consigliati
Ricerca di stringhe
Comando grep di Linux
Il comando grep trova nei file le righe che corrispondono a stringhe ed espressioni regolari. Si usa per cercare in una volta in più file passati tramite xargs.
Eliminare file
Comando rm di Linux
Un articolo sul comando rm, che elimina file e cartelle, e sui pericoli dell'opzione -rf. Controlla le opzioni prima di mettere rm dopo xargs.
Terminare processi
Comando kill di Linux
Il comando kill invia un segnale a un numero di processo per terminarlo. Si usa di seguito quando passi tramite xargs un elenco di numeri di processo da terminare.
ℹ️ 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.