GNU/Linux: comandi dinamici con xargs

xargs è un comando poco conosciuto e poco utilizzato, ma permette di fare diverse cosette interessanti. Il suo compito principale è prendere in input una serie di argomenti dallo standard input e trasformarli nei parametri di un dato comando. Sembra complicato, ma dopo il primo esempio diventa facilissimo.

Preparare la cartella di prova

Creiamo una directory di lavoro con un paio di file di testo:

mkdir prova-xargs
cd prova-xargs
echo "contenuto del primo file" > file1.txt
echo "contenuto del secondo file" > file2.txt
ls *.txt

I primi esempi

La lista che ls ci restituisce può essere passata a xargs. Cominciamo con il comando più semplice, echo: l’output di ls entra in xargs, che lo restituisce come argomenti di echo.

ls *.txt | xargs echo

Sostituiamo echo con cat. Ora xargs lancia cat con i nomi dei file ricevuti, e invece dei nomi vediamo i contenuti:

ls *.txt | xargs cat

Vedere cosa fa: -t

L’opzione -t ci mostra la riga di comando che xargs sta per eseguire:

ls *.txt | xargs -t cat

Prima di eseguire, xargs scrive cat file1.txt file2.txt, che è la riga di comando completa.

Chiedere conferma: -p

Con -p xargs ci chiede una conferma prima di eseguire. Rispondiamo sì e il comando viene eseguito, rispondiamo no e non succede niente:

ls *.txt | xargs -p cat

Un argomento alla volta: -n

Normalmente tutti gli elementi ricevuti dallo standard input vengono concatenati in una sola riga di comando. Se invece vogliamo limitare il numero di argomenti per ogni esecuzione, per esempio uno alla volta, si usa -n:

ls *.txt | xargs -t -n 1 cat

Questa volta vengono eseguiti due cat separati, uno per file.

Il segnaposto: -I

Un’opzione molto potente è quella che permette di usare un segnaposto per rappresentare l’elemento ricevuto, in qualunque punto della riga di comando. Questo permette di costruire comandi anche molto complessi e dinamici. Per esempio, vogliamo fare una copia di backup di ogni file di testo, aggiungendo l’estensione .back. A mano sarebbe:

cp file1.txt file1.txt.back

Con molti file è antieconomico, quindi lasciamo fare a xargs. Con -I si dichiara il segnaposto, che può essere qualunque stringa; qui uso la classica coppia di graffe:

ls *.txt | xargs -t -I{} cp {} {}.back

La riga è stata eseguita due volte, una per file. Con ls vediamo che ogni file ha il suo .back.

ls

Xargs con find

Vediamo xargs insieme a find. Cerchiamo i file .back:

find . -name "*.back"

E passiamo il risultato a xargs con rm -f: i file back spariscono.

find . -name "*.back" | xargs rm -f

(Se i nomi dei file possono contenere spazi, la versione sicura è find . -name “*.back” -print0 | xargs -0 rm -f.)

Leggere da un file: -A

xargs può prendere l’input anche da un file invece che dallo standard input. Costruiamo un file lista con l’elenco dei file di testo:

ls *.txt > lista
cat lista

Con l’opzione -a si indica il file da cui leggere. Prima una cosa semplice con echo:

xargs -a lista echo

E poi lo stesso backup di prima, usando la lista come input e un altro segnaposto:

xargs -a lista -I% cp % %.back

Il risultato è lo stesso di prima.

Per finire

Questo è più o meno tutto ciò che c’è da dire di importante su xargs; resta qualche argomento più avanzato, da approfondire per compito a casa. Aprite la vostra Linux box e cominciate a provare. Scrivetemi nei commenti qual è il vostro uso preferito di xargs.

Link e risorse

Sostieni il canale

PER SOSTENERE IL CANALE BASTANO UN LIKE E UN’ISCRIZIONE!
ma se vuoi offrirmi un caffè, mi aiuterà a rimanere sveglio mentre registro i video 😁☕
clicca qui per scoprire come https://buymeacoffee.com/thelinuxnerd

questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!