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