Introduzione

L'utilità xargs consente di creare ed eseguire comandi dall'input standard.

xargs viene solitamente utilizzato in combinazione con altri comandi tramite pipe. Con xargs puoi fornire input standard come argomenti per le utility da riga di comando come mkdir e rm.

In questo tutorial, tratteremo le basi dell'uso del comando xargs.

Come usare il comando Xargs

xargs legge gli argomenti dall'input standard, separato da spazi vuoti o newline, ed esegue il comando specificato usando l'input come argomenti del comando. Se non viene fornito alcun comando, l'impostazione predefinita è /bin/echo.

La sintassi per il comando xargs è la seguente:

xargs [OPTIONS] [COMMAND [initial-arguments]]

L'esempio più basilare di utilizzo del comando xargs sarebbe quello di passare diverse stringhe separate da spazi bianchi usando una pipe ed eseguire un comando che userà quelle stringhe come argomenti.

echo "file1 file2 file3" | xargs touch

Nell'esempio sopra stiamo eseguendo il piping dell'input standard verso xargs e il comando touch viene eseguito per ogni argomento, creando tre file. È lo stesso che se avessi eseguito:

touch file1 file2 file3

Visualizzare il comando

Per stampare il comando sul terminale prima di eseguirlo, utilizzare l'opzione -t (--verbose):

echo  "file1 file2 file3" | xargs -t touch
touch file1 file2 file3

Se si desidera ottenere un prompt se eseguire ciascun comando prima di eseguirlo, utilizzare l'opzione -p (--interactive):

echo  "file1 file2 file3" | xargs -p touch

Digitare y o Y per confermare ed eseguire il comando:

touch file1 file2 file3 ?...y

Questa opzione è utile quando si eseguono comandi distruttivi.

Come limitare il numero di argomenti

Per impostazione predefinita, il numero di argomenti passati al comando è determinato dal limite del sistema.

L'opzione -n (--max-args) specifica il numero di argomenti da passare al comando dato. xargs eseguirà il comando specificato tutte le volte necessarie fino all'esaurimento di tutti gli argomenti.

Nel seguente esempio, il numero di argomenti letti dall'input standard è limitato a 1.

echo  "file1 file2 file3" |  xargs -n 1 -t touch

Come puoi vedere dall'output dettagliato di seguito, il comando touch viene eseguito separatamente per ogni argomento:

touch file1
touch file2
touch file3

Come eseguire più comandi

Per eseguire più comandi con xargs, utilizzare l'opzione -I. Funziona definendo un replace-str dopo -I e quindi tutte le occorrenze di replace-str vengono sostituite con l'argomento passato a xargs.

L'esempio xargs seguente eseguirà due comandi, prima creerà i file usando touch e quindi elencherà i file con il comando ls:

echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }'
-rw-r--r-- 1 noviello users 0 Oct 16 01:52 file1
-rw-r--r-- 1 noviello users 0 Oct 16 01:52 file2
-rw-r--r-- 1 noviello users 0 Oct 16 01:52 file3

Una scelta comune per replace-str è %, tuttavia, è possibile utilizzare un altro segnaposto, ad esempio ARGS:

echo "file1 file2 file3" | xargs -t -I ARGS sh -c '{ touch ARGS; ls -l ARGS; }'

Come specificare un delimitatore

Utilizzare l'opzione -d (--delimiter) per impostare un delimitatore personalizzato che può essere un singolo carattere o una sequenza di escape che inizia con \.

Nel seguente esempio usiamo ; come delimitatore:

echo  "file1;file2;file3" | xargs -d \; -t touch
touch file1 file2 file3

Come leggere gli elementi dal file

Il comando xargs può anche leggere elementi da un file anziché dallo standard input. Per fare ciò usa l'opzione -a (--arg-file) seguita dal nome del file.

Nel seguente esempio, il comando xargs leggerà il file ips.txt e eseguirà il ping di ciascun indirizzo IP.

8.8.8.8
1.1.1.1

Stiamo anche utilizzando l'opzione -L 1 che indica al comando xargs di leggere una riga alla volta. Se questa opzione viene omessa, tutti gli IP passeranno a un singolo comando ping.

xargs -t -L 1 -a ips.txt ping -c 1
ping -c 1 8.8.8.8 
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=68.1 ms

...
ping -c 1 1.1.1.1 
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=21.4 ms

Utilizzare xargs con find

xargs viene spesso utilizzato in combinazione con il comando find. È possibile utilizzare find per cercare file specifici e quindi utilizzare xargs per eseguire operazioni su tali file.

Per evitare problemi con i nomi di file che contengono newline o altri caratteri speciali, utilizzare sempre l'opzione -print0 che farà sì che find stampi il nome completo del file seguito da un carattere null. Questo output può essere interpretato correttamente con xargs utilizzando l'opzione -0, (--null).

Nel seguente esempio, find stamperà i nomi completi di tutti i file all'interno della directory /var/www/.cache e xargs passerà i percorsi dei file al comando rm:

find /var/www/.cache -type f -print0 | xargs -0 rm -f

Usare xargs per tagliare (trim) gli spazi

xargs può anche essere usato come strumento per rimuovere spazi bianchi da entrambi i lati di una determinata stringa. Basta reindirizzare la stringa al comando xargs e farà il taglio:

echo "  Long line " | xargs
Long line

Questo può essere utile quando si confrontano le stringhe negli script di shell.

#!/bin/bash

VAR1=" Noviello "
VAR2="Noviello"

if [[ "$VAR1" == "$VAR2" ]]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi

## Using xargs to trim VAR1
if [[ $(echo "$VAR1" | xargs) == "$VAR2" ]]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi
Strings are not equal.
Strings are equal.

Conclusione

Ormai dovresti avere una buona conoscenza di come usare il comando xargs Linux. Per informazioni più dettagliate sulle opzioni di xargs, digitare il seguente comando:

manx xargs