2011-07-07 3 views
11

Objetivo: listar archivos en todos los jar.xargs jar tvf - no funciona

Esto funciona:

for f in `find . -name "*.jar"`; do jar tvf $f; done 

Esto funciona también:

find . -name "*.jar" -exec jar tvf {} \; 

Esto no (no se imprime ninguna salida):

find . -name "*.jar" | xargs jar tvf 

¿Por qué este último no funciona ?

Respuesta

14

hace esto funciona

find . -name "*.jar"|xargs -n 1 jar -tvf 
+0

Sí, gracias. – Synesso

7

El problema es que jar tvf sólo permite un archivo que se aprobó en.

El bucle se ejecuta los archivos uno por uno

jar tvf 1.jar; jar tvf 2.jar; ... 

Sin embargo, xargs intenta ajustar tantos argumentos en una línea como sea posible. Por lo tanto, está tratando los siguientes:

jar tvf 1.jar 2.jar ... 

Esto se puede comprobar mediante la colocación de un eco en su comando:

for f in `find . -name "*.jar"`; do echo jar tvf $f; done 
find . -name "*.jar" | xargs echo jar tvf 

La solución correcta es la xargs dicen utilizar solamente un parámetro por comando:

find . -name "*.jar" | xargs -n 1 jar tvf 

o

find . -name "*.jar" | xargs -i jar tvf {} # Find style parameter placement 
+0

Gracias por la explicación. – Synesso

+0

Gracias por la pista '-i', agradable. – sarnold

+0

@sarnold debe saber que este argumento ('-i') está en desuso. ver hombre xargs ('xargs (GNU findutils) 4.4.2'):' Esta opción está en desuso; use -I en su lugar. No hay problema para usarlo en modo interactivo, pero lo evitaría en las secuencias de comandos, ya que podría desaparecer en las versiones futuras de xargs. – Lynch

6

No funciona porque xargs invoca solo un proceso con todos los argumentos.

Hay una manera de invocar un nuevo proceso para cada argumento usando -I'{}'.

Pruebe lo siguiente para entender:

$ seq 10 | xargs echo 
1 2 3 4 5 6 7 8 9 10 
$ seq 10 | xargs -I'{}' echo {} 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
Cuestiones relacionadas