いくつかのクラスを見つけたい複数のjarディレクトリがあります。次のコマンドでクラスが存在するかどうかを確認する解決策を見つけました:
find -name "*.jar" | xargs -n 1 jar tf | grep 'myClass'
問題は、それがどのjar
にあるのかわからないことです。
ターミナルにファイル名を表示するための解決策を探しています。私の現在の出力はそのようなものです:
[user@server lib]$ find -name "*.jar" | xargs -n 1 jar tf | grep 'RollOn'
com/ventyx/utils/logutils/rolling/RollOnDemandAppender.class
助言がありますか?
GNU grep
:
find . -type f -name '*.jar' -exec sh -c '
for file do
jar tf "$file" | grep -H --label="$file" myClass
done' sh {} +
または、たとえばawkを使用します。
find . -type f -name '*.jar' -exec sh -c '
export FILE
for FILE do
jar tf "$FILE" | awk '\''/myClass/ {
print ENVIRON["FILE"] ": " $0}'\''
done' sh {} +
bsdtar
(jar
ファイルはZip
ファイルであり、bsdtar
はそれらをサポートしているため)を使用して、それ自体でマッチングを行うこともできます(より多くのファイルを使用できます)。ファイルメタデータを含む詳細な出力(そのメタデータでgrep
が一致するリスクを冒さない)。ただし、ファイル名を挿入するにはgrep
のようなものが必要です。
find . -type f -name '*.jar' -exec sh -c '
for file do
bsdtar tvf "$file" "*myClass*" | grep -H --label="$file" "^"
done' sh {} +
それを行う1つの方法:
find . -type f -name '*.jar' -exec \
sh -c 'jar tf "$1" | grep -q "$2" && printf -- '%s\n' "$1"' sh {} 'RollOn' \;
Bashを使用する場合:
shopt -s globstar
for file in **/*jar; do
jar tf "$file" | grep -q 'myClass' && printf '%s\n' "$file"
done
または、ファイル名と一致する行の両方を出力するには:
shopt -s globstar
for file in **/*jar; do
jar tf "$file" | awk -vf="$file" '/myClass/{print f":"$0}'
done