Según tengo entendido, lo siguiente debería significar exactamente lo mismo:
ls -1 | xargs file {}
ls -1 | xargs -I{} file {}
si no se especifica la opción -I, el valor predeterminado es -I {}.
Quiero enumerar todos los archivos en el directorio actual y ejecutar el filecomando en cada uno de ellos. Algunos tienen espacios en sus nombres. Sin embargo, noté la diferencia. Vea abajo:
$ 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 {} especificado explícitamente, los espacios en blanco en los nombres de archivo se tratan como se esperaba.
xargs fileo xargs -I{} file {}. No debería ser xargs file {}. Supongo que al especificar explícitamente -I {}, el bash lo tratará como file "Hello World". Sin -I {}, se trata como file Hello World.
-1opción ls, pero está activada de forma predeterminada cuando la salida de lses un archivo o una tubería, por lo que no la necesita aquí. (3) Estás confundiendo -Icon la opción obsoleta -i(minúscula I). -ifooes equivalente a -Ifoo, pero plain -ies equivalente a -I{}. Pero uso -I{}. (4) Si realmente quieres hacer lo que dices que quieres hacer, ¿por qué no decirlo file *?
file. Pero se me ocurrió un ejemplo más simple usando ls. Tienes razón. Por eso, file *es lo mejor.
-exec.