xargs rm
invocherà rm
con tutti gli argomenti come parametro partiti con spazi.
xargs -i{} rm {}
invocherà rm {}
per ogni argomento e {}
sarà sostituito dall'argomento corrente.
Se hai 2 argomenti a.txt
e b.txt
, xargs rm
chiamerà questo
rm a.txt b.txt
Ma xargs -i{} rm {}
chiamerà
rm a.txt
rm b.txt
Questo perché -i
opzione implica -L 1
opzione che significa il comando rm
richiederà solo 1
linea ogni volta. E qui ogni riga contiene solo 1 argomento.
Controlla questo link Ideone per farti un'idea più chiara.
Con le parentesi graffe genererà un rm
processo per file. Senza le parentesi graffe, xargs
passerà il maggior numero possibile di nomi di file a ciascun rm
comando.
Confronta
ls | xargs echo
e
ls | xargs -i echo '{}'
L'opzione -i (equivalente a --replace) crea una sorta di segnaposto in cui xargs memorizza l'input appena ricevuto. Nel tuo secondo comando, il segnaposto è "{}", funziona come l'opzione find -exec. Una volta definito, xargs sostituirà questo segnaposto con l'intera riga di input. Se non ti piace il nome "{}", puoi definirne uno tuo:
ls | xargs -iPLACEHOLDER echo PLACEHOLDER
Nel tuo caso, entrambi i comandi stanno producendo lo stesso risultato. Nella seconda forma, stai solo rendendo esplicito il comportamento predefinito con l'opzione -i.