目的: すべての jar 内のファイルを一覧表示する。
これは機能します:
for f in `find . -name "*.jar"`; do jar tvf $f; done
これも機能します:
find . -name "*.jar" -exec jar tvf {} \;
これはしません (何も出力しません):
find . -name "*.jar" | xargs jar tvf
後者が機能しないのはなぜですか?
これは機能しますか
find . -name "*.jar"|xargs -n 1 jar -tvf
問題は、jar tvf
1 つのファイルしか渡せないことです。
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
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