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#
| Comando | Flag | Significato flag | Cosa fa |
|---|---|---|---|
find . -name "*.log" | xargs ls -l | — | — | Lista dettagliata di tutti i .log trovati |
find . -name "*.tmp" | xargs rm | — | — | Cancella tutti i .tmp trovati |
find . -name "*.py" | xargs wc -l | — | — | Conta le righe di tutti i .py |
find . -print0 | xargs -0 comando | -0 | null | Usa null come separatore — gestisce spazi nei nomi |
find . -name "*.txt" | xargs -I {} cp {} /backup/ | -I {} | replace | Sostituisce {} con ogni argomento — posizionamento preciso |
echo "a b c" | xargs -n 1 echo | -n | number | Passa n argomenti alla volta invece di tutti insieme |
cat lista.txt | xargs -P 4 comando | -P | parallel | Esegue 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 lsRegola 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 separatoreCombinazioni 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 gzipScenario 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 — sospettoDove 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

