Secondo la mia comprensione, quanto segue dovrebbe significare esattamente lo stesso:
ls -1 | xargs file {}
ls -1 | xargs -I{} file {}
se l'opzione -I non è specificata, è predefinita -I {}.
Voglio elencare tutti i file nella directory corrente ed eseguire il filecomando su ciascuno di essi. Alcuni hanno spazi nei loro nomi. Tuttavia, ho notato la differenza. Vedi sotto:
$ ls -1
Hello World
$ ls -1 | xargs file {}
{}: ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory
Con -I {} esplicitamente specificato, gli spazi vuoti nei nomi dei file vengono trattati come previsto.
xargs fileo xargs -I{} file {}. Non dovrei essere xargs file {}. Immagino che quando si specifica esplicitamente -I {}, la bash lo tratterà come file "Hello World". Senza -I {}, viene trattato come file Hello World.
-1opzione ls, ma è attivo per impostazione predefinita quando l'output di lsè un file o una pipe, quindi non è necessario qui. (3) Stai confondendo -Icon l' opzione deprecata -i(minuscola I). -ifooè equivalente a -Ifoo, ma plain -iè equivalente a -I{}. Ma usa -I{}. (4) Se vuoi davvero fare quello che dici di voler fare, perché non dire semplicemente file *?
file. Ma ho trovato un esempio più semplice usando ls. Hai ragione. Per quello, file *è il migliore.
-exec.