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 fileoxargs -I{} file {}. No debería serxargs file {}. Supongo que al especificar explícitamente -I {}, el bash lo tratará comofile "Hello World". Sin -I {}, se trata comofile Hello World.-1opciónls, pero está activada de forma predeterminada cuando la salida delses un archivo o una tubería, por lo que no la necesita aquí. (3) Estás confundiendo-Icon la opción obsoleta-i(minúsculaI).-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 decirlofile *?file. Pero se me ocurrió un ejemplo más simple usandols. Tienes razón. Por eso,file *es lo mejor.-exec.Respuestas:
El
-Irequiere un marcador de posición definido. La-iopción asumirá{}es el marcador de posición. Aquí fue donde encontré cualquier suposición de {}man xargsal menos en Cygwin y CentOS.xargs llamado sin ninguna de las opciones no necesita el marcador de posición y solo agrega el STDIN al final de los argumentos.
Simplemente agregue
echoa sus ejemplos para ver qué está haciendo xargs:Su ejemplo de error usa
{}:entonces el
filecmd ve argumentos{} Hello Worldy errores.Si desea usar explícitamente
{}en su llamada xargs:O sin marcador de posición:
xargs como se llamó anteriormente no necesita el {}. Agrega el STDIN al final del comando sin un marcador de posición. El uso de {} generalmente significa que desea que se ejecute el STDIN en algún lugar en el medio del cmd, como en:
fuente