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
oxargs -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
.-1
opciónls
, pero está activada de forma predeterminada cuando la salida dels
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úsculaI
).-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 decirlofile *
?file
. Pero se me ocurrió un ejemplo más simple usandols
. Tienes razón. Por eso,file *
es lo mejor.-exec
.Respuestas:
El
-I
requiere un marcador de posición definido. La-i
opción asumirá{}
es el marcador de posición. Aquí fue donde encontré cualquier suposición de {}man xargs
al 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
echo
a sus ejemplos para ver qué está haciendo xargs:Su ejemplo de error usa
{}
:entonces el
file
cmd ve argumentos{} Hello World
y 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