このコマンドをすばやく作成する方法: find ./ -maxlength 1 -type f -name "*.*ar" ! -name "*.tar" -exec zipgrep -qr "$classpathjarname" '{}' \;

このコマンドをすばやく作成する方法: find ./ -maxlength 1 -type f -name

私の目標は、現在のディレクトリにあるすべてのjar、war、earファイルのマニフェストでjarエントリを繰り返し検索することです。次に、見つかった一致するアーカイブ名を印刷します。。アーカイブ名を印刷していますが、grepが一致する項目を出力します。

注文する

find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -exec zipgrep -qr "$classpathjarname" '{}' \; -print

効果的ですが時間がかかります。

次のコマンドを試しましたが失敗しました。

find ./ -maxdepth 1 -type f -name "*.*ar" ! -name '*.tar' -print0 | xargs -r0 -P2 zipgrep -rq 'classpath.jar'

エラーが発生しました

caution: filename not matched:  ./abc.jar
caution: filename not matched:  ./dsf.jar
/usr/bin/zipgrep: line 97: test: -eq: unary operator expected
/usr/bin/zipgrep: line 100: test: : integer expression expected

ベストアンサー1

xargsはもはや古いほど役に立ちません。 find が修正され、もう必要ありません。 aの代わりにaでコマンドラインを終了すると、-exec結果の配置自体からfindが呼び出されます。 mosvyが指摘したように、xargsはfindと並列に実行されますが、これは私の処理にとって非常に重要ではないと思います。ただし、ループで圧縮ファイルを検索しているので、この方法が役に立ちます。+;

find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -exec zipgrep -lr "$classpathjarname" {} +

あなたの選択肢はあなたがそれを理解していないので動作しません。最初のバージョンの仕組みは、終了ステータスを介して一致を報告するzipgrepに依存します。このバリアントは、-lオプションが実行するものと一致するファイル名を報告するzipgrepによって異なります。

find ./ -maxdepth 1 -type f -name "*.*ar" ! -name "*.tar" -print0 | xargs -0 -P2 zipgrep -lr "$classpathjarname"

これがxargsを使って行う方法です。 zipgrepエラーメッセージは、zipファイルではなくファイルがあるか、zipgrepに送信される空のzipファイルを探しているために発生します。

ただし、最初のスクリプトにかかる時間の大部分は、圧縮ファイルの内容にアクセスするのに時間がかかるため、最初の方法よりはるかに高速ではありません。

おすすめ記事