2011-07-07 5 views
11

目的:すべてのjarファイルをリストします。xargs jar tvf - 動作しません。

これは動作します:

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

これはあまりにも動作します:

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

これは(それがどの出力を印刷しません)していません。

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

なぜ、後者は動作しません。 ?

答えて

14

この問題はjar tvfは、ファイルは1つだけで渡すことができることです

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

はい、ありがとうございます。 – Synesso

7

を働くん。

ザ・ループのために、しかし、ファイル1

ずつ
jar tvf 1.jar; jar tvf 2.jar; ... 

を実行しますxargsはできるだけ多くの引数を1行に収めようとします。したがって、それはしようとしている以下:

jar tvf 1.jar 2.jar ... 

あなたのコマンドでエコーを置くことによってこれを確認することができます

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

適切な解決策が唯一のコマンドごとに1つのパラメータを使用するようにxargsのを教えてくれています

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

または

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

ありがとうございます。 – Synesso

+0

'-i'ヒントに感謝して、nice。 – sarnold

+0

@sarnoldこの引数( '-i')は非推奨であることを知っておく必要があります。 man xargs( 'xargs(GNU findutils)4.4.2'):'このオプションは非推奨です。 -I代わりに使用してください。対話モードで使用するのに問題はありませんが、xargsの未来のバージョンでは消える可能性があるので、スクリプトでは使用しません。 – Lynch

6

xargsはすべての引数を持つプロセスを1つしか呼び出さないため、動作しません。

-I'{}'を使用して、各引数に新しいプロセスを呼び出す方法があります。

を理解するためにこれを試してみてください:

$ 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 
関連する問題