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 file
comando 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 file
o 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
.
-1
opción ls
, pero está activada de forma predeterminada cuando la salida de ls
es un archivo o una tubería, por lo que no la necesita aquí. (3) Estás confundiendo -I
con la opción obsoleta -i
(minúscula I
). -ifoo
es equivalente a -Ifoo
, pero plain -i
es 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
.