11

目的: すべての jar 内のファイルを一覧表示する。

これは機能します:

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

これも機能します:

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

これはしません (何も出力しません):

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

後者が機能しないのはなぜですか?

4

3 に答える 3

16

これは機能しますか

find . -name "*.jar"|xargs -n 1 jar -tvf
于 2011-07-07T23:46:54.573 に答える
9

問題は、jar tvf1 つのファイルしか渡せないことです。

forループはファイルを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
于 2011-07-07T23:50:32.603 に答える
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
于 2011-07-07T23:54:41.963 に答える