Skip to main content
  1. Comandi/

xargs - build and execute command lines from stdin

·4 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

Cosa fa
#

Legge dati da stdin (tipicamente una lista di nomi file) e li converte in argomenti per un comando. Risolve il problema che molti comandi non accettano pipe direttamente — rm, chmod, ls vogliono argomenti, non stdin.

Sintassi
#

comando | xargs [opzioni] comando_destinazione

Il problema che risolve
#

# Questo NON funziona — rm non legge da stdin
find . -name "*.tmp" | rm        # ERRORE

# Questo funziona — xargs converte stdin in argomenti
find . -name "*.tmp" | xargs rm  # OK
# equivale a: rm file1.tmp file2.tmp file3.tmp ...

Comandi essenziali
#

ComandoFlagSignificato flagCosa fa
find . -name "*.log" | xargs ls -lLista dettagliata di tutti i .log trovati
find . -name "*.tmp" | xargs rmCancella tutti i .tmp trovati
find . -name "*.py" | xargs wc -lConta le righe di tutti i .py
find . -print0 | xargs -0 comando-0nullUsa null come separatore — gestisce spazi nei nomi
find . -name "*.txt" | xargs -I {} cp {} /backup/-I {}replaceSostituisce {} con ogni argomento — posizionamento preciso
echo "a b c" | xargs -n 1 echo-nnumberPassa n argomenti alla volta invece di tutti insieme
cat lista.txt | xargs -P 4 comando-PparallelEsegue il comando in 4 processi paralleli

xargs vs -exec di find
#

# -exec con \; — esegue il comando UNA VOLTA PER FILE (lento)
find . -name "*.log" -exec ls -l {} \;
# ls -l file1.log
# ls -l file2.log
# ls -l file3.log  ← 3 invocazioni di ls

# -exec con + — passa tutti i file in una volta (veloce)
find . -name "*.log" -exec ls -l {} +
# ls -l file1.log file2.log file3.log  ← 1 invocazione di ls

# xargs — equivalente a -exec con +
find . -name "*.log" | xargs ls -l
# ls -l file1.log file2.log file3.log  ← 1 invocazione di ls

Regola pratica: -exec {} + e xargs sono equivalenti in velocita'. Usa xargs quando vuoi costruire pipeline piu' complesse o combinare con altri comandi.

Gestire nomi con spazi
#

# PROBLEMA — nomi con spazi rompono xargs
touch "file con spazi.txt"
find . -name "*.txt" | xargs rm    # ERRORE — rm riceve "file", "con", "spazi.txt" separati

# SOLUZIONE — null separator
find . -name "*.txt" -print0 | xargs -0 rm
# -print0 usa \0 (null) invece di \n come separatore
# -0 dice a xargs di usare \0 come separatore

Combinazioni utili
#

# Trova file .py e conta le righe totali
find . -name "*.py" | xargs wc -l | tail -1

# Grep in tutti i file trovati
find /etc -type f | xargs grep -l "password" 2>/dev/null
# -l = mostra solo i nomi file che contengono il pattern

# Copia tutti i file .conf in una directory di backup
find /etc -name "*.conf" | xargs -I {} cp {} /backup/

# Verifica integrita' di molti file
find /etc -type f | xargs sha256sum > /root/etc_hashes.txt

# Esecuzione parallela — 4 processi
find . -name "*.log" | xargs -P 4 gzip

Scenario Reale
#

# Incident response — trova tutti i file modificati nelle ultime 2 ore
# e calcola il loro hash per documentazione forense
find / -type f -mmin -120 2>/dev/null | xargs sha256sum >> /tmp/modified_files.txt

# Cerca una stringa sospetta in tutti i file di configurazione
find /etc -type f -name "*.conf" | xargs grep -l "curl\|wget\|nc " 2>/dev/null
# Trova file di configurazione che contengono comandi di download — sospetto

Dove l'ho usato
#

  • Cap 17 TLCL — pipeline con find

Note personali
#

Tip

Quando in dubbio, aggiungi echo prima del comando per vedere cosa farebbe xargs senza eseguirlo: find . -name "*.tmp" | xargs echo rm Stampa i comandi che verrebbero eseguiti senza toccare niente.

Warning

find . | xargs rm senza filtri e' pericoloso — cancella tutto. Aggiungi sempre un filtro -name o -type prima di usare xargs rm.


## Collegato a

- system — categoria
- [find](/comandi/find/) — sorgente principale di xargs
- [grep](/comandi/grep/) — spesso usato dopo xargs per filtrare contenuto

Related