8 esempi pratici di comando Linux Xargs per principianti
Il comando Linux xargs potrebbe non essere uno strumento da riga di comando molto popolare, ma ciò non cambia il fatto che sia estremamente utile, soprattutto in combinazione con altri comandi come find e grep. Se non conosci ancora xargs e vuoi capirne l'utilizzo, sarai felice di sapere che faremo proprio questo qui.
Before we proceed, please keep in mind that all the examples presented in this tutorial have been tested on Ubuntu 22.04 LTS. The shell used on my system is Bash.
1. Come funziona il comando Xargs?
Bene, prima di passare al suo utilizzo, è importante capire cosa fa esattamente Xargs. In parole povere, lo strumento, nella sua forma più elementare, legge i dati dall'input standard (stdin) ed esegue il comando (fornito come argomento) una o più volte in base all'input letto. Eventuali spazi vuoti e spazi nell'input vengono trattati come delimitatori, mentre le righe vuote vengono ignorate.
Se non viene fornito alcun comando come argomento a xargs, il comando predefinito eseguito dallo strumento è echo. Ad esempio, nell'esempio seguente, ho appena eseguito "xargs" e inserito "Hello World" su stdin. Quando ho premuto Ctrl+D (per dire a xargs che abbiamo finito con l'input), il comando echo è stato eseguito automaticamente e "Hello World" è stato stampato di nuovo.
2. Come utilizzare xargs con un altro comando?
Sebbene echo sia il comando predefinito eseguito da xargs, puoi specificare esplicitamente qualsiasi altro comando. Ad esempio, puoi passare il comando find insieme alla sua opzione '-name' come argomento a xargs, quindi passare il nome del file (o del tipo di file) che desideri trovare da cercare come input tramite stdin.
Ecco il comando completo in questione:
xargs find -name
Ad esempio, abbiamo fornito "*.txt" in input tramite stdin, il che significa che vogliamo che il comando find cerchi tutti i file .txt nella directory corrente (così come nelle sue sottodirectory).
Ecco il comando in azione:
3. Come fare in modo che xargs esegua il comando più volte (una volta per ogni riga/argomento di input)
Nell'esempio discusso nella sezione precedente, volevamo cercare file .txt, quindi abbiamo fornito "*.txt" nell'input. Ma cosa succede se l'esigenza è quella di cercare anche altri tipi di file, come .log e .tmp?
Prova a fornirli come input a xargs dopo "*.txt" e guarda cosa succede. Bene, dovresti ricevere un errore simile al seguente:
Questo perché xargs passa "*.txt" e "*.log" come input del nome file al comando find e quindi find fallisce poiché viene eseguito con due nomi di file in input . Puoi pensare al comando find in esecuzione nel modo seguente:
find -name "*.txt" "*.log"
E non è il modo corretto.
Ciò che vogliamo è che il comando xargs passi prima "*.txt" al comando find, in modo che find ci fornisca risultati relativi ai file .txt, e poi " *.log" viene passato. Questo può essere fatto utilizzando l'opzione della riga di comando -L fornita da xargs.
L'opzione della riga di comando -L richiede un numero che considera come il numero massimo di righe non vuote che devono essere passate come input al comando in una sola volta. Quindi, nel nostro caso, il valore sarà 1, poiché vogliamo che una riga di input venga passata come input a find alla volta.
Quindi, ecco il comando che dovremmo eseguire:
xargs -L 1 find -name
Lo screenshot seguente mostra il comando sopra menzionato in azione:
Fin qui tutto bene. Ma cosa succede se passi l'input nel modo seguente:
"*.txt" "*.log"
Bene, il comando fallirà perché '-L 1' farà in modo che la riga completa venga passata al comando find.
In situazioni come queste, puoi utilizzare l'opzione della riga di comando '-n'.
L'opzione della riga di comando '-n', come '-L', richiede un numero che rappresenti il numero di argomenti che vuoi che xargs passi per riga di comando. Nel caso di cui abbiamo appena discusso, "*.txt" e "*.log" dovrebbero essere argomenti diversi e, poiché vogliamo che vengano passati individualmente, dovremo fornire "1" come valore a "-n" .
xargs -n 1 trova -nome
Quindi questi sono i modi in cui possiamo fare in modo che xargs esegua un comando più volte.
4. Come fare in modo che xargs gestisca i nomi dei file con spazi
Se ricordi, all'inizio abbiamo menzionato che xargs tratta gli spazi vuoti (così come i caratteri di nuova riga) come delimitatori. Ciò potrebbe causare problemi nei casi in cui i nomi file passati come input a xargs contengono spazi.
Ad esempio, supponiamo che la directory corrente contenga un file denominato "new music.mp3" e desideri che xargs passi questo nome a mplayer in modo che quest'ultimo possa riprodurre il file. Se segui il metodo convenzionale, riceverai un errore:
Questo perché a causa dello spazio tra "nuovo" e "music.mp3", questi vengono trattati da mplayer come due file diversi. Un modo per risolvere questo problema è utilizzare la barra rovesciata fornendo l'input:
new\ music.mp3
L'altro modo è cambiare il delimitatore, cosa che puoi fare usando l'opzione -d. Ad esempio, puoi chiedere a xargs di considerare solo il ritorno a capo come delimitatore, cosa che può essere fatta nel modo seguente:
xargs -d '\n' mplayer
5. Come fare in modo che xargs gestisca i nomi dei file con caratteri di nuova riga
Quindi, ora sappiamo come possiamo fare in modo che xargs gestisca i nomi di file che contengono spazi bianchi. Ma per quanto riguarda le nuove righe? Sì, anche i nomi dei file possono contenere caratteri di nuova riga. Ad esempio, c'è un file chiamato 'foo'[newline]'file.txt'. Sul terminale, il nome viene visualizzato come "foo?file.txt".
Ora, supponiamo che io voglia che il comando find trovi tutti i file con nomi che iniziano con il testo "foo" e quindi utilizzi xargs per aprire questi file in gedit. Ecco il comando:
find . -name "foo*" | xargs gedit
Purtroppo, il comando non riesce a raggiungere il suo scopo poiché in Gedit si apre un nuovo file con il nome "foo". Ciò è probabile perché il carattere di nuova riga viene trattato come delimitatore da xargs.
Per risolvere questo problema, usa l'opzione -print0 che trova le offerte e accoppiala con l'opzione -0 di xarg. Ecco come la pagina man di find spiega questa opzione:
-print0
True; print the full file name on the standard output, followed by a null character (instead of thenewline character that -print uses). This allows file names that contain newlines or other types ofwhite space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.
Quindi, ecco il comando che dovremmo usare:
find . -name "foo*" -print0 | xargs -0 gedit
6. Come trovare file contenenti un testo specifico
Il comando xargs è davvero utile se vuoi cercare file contenenti un testo/stringa specifico. Ad esempio, se desideri trovare file .txt contenenti il testo "abc", puoi farlo nel modo seguente:
find -name "*.txt" | xargs grep "abc"
Ecco il comando in azione:
Come è abbastanza ovvio, in questo caso, il comando xargs riceve il suo input dal comando find.
7. Come fare in modo che xargs accetti l'input da un file
Finora abbiamo visto xargs accettare input da stdin (che è il comportamento predefinito) così come da un altro comando (discusso nell'ultima sezione). Tuttavia, se lo desideri, puoi anche fare in modo che xargs accetti l'input da un file.
L'opzione -a del comando ti consente di farlo. Questa opzione prevede un nome file: questo sarebbe il file da cui xargs leggerà l'input.
Ad esempio, supponiamo che ci sia un file con il nome "input.txt". Contiene l'input per xargs (sostanzialmente, i contenuti sono due nomi di file: testfile1.txt e testfile2.txt). Ecco come è possibile utilizzare xargs per leggere l'input da questo file e passarlo a un altro comando, ad esempio ls.
xargs -a input.txt ls -lart
Ecco il comando in azione:
8. Come fare in modo che xargs richieda l'autorizzazione dell'utente prima di eseguire un comando
Abbiamo già discusso di come fare in modo che xargs esegua un comando più volte (vedi punto 3 sopra). Ma cosa succede se vuoi che xargs chieda la tua autorizzazione ogni volta che esegue il comando? È possibile? Sì, lo è: l'opzione della riga di comando -p lo rende possibile.
Ecco un esempio di come puoi eseguire xargs in modalità interattiva:
Abbiamo appena scalfito la superficie poiché ci sono molte altre funzionalità fornite dal comando xargs sotto forma di opzioni della riga di comando. Prova i concetti/funzionalità di xargs che abbiamo spiegato in questo tutorial e, in caso di dubbi o domande, consulta la sua pagina man.