Eu tenho um diretório jar múltiplo no qual gostaria de localizar algumas classes. Encontrei uma solução para ver se existe uma classe com o seguinte comando:
find -name "*.jar" | xargs -n 1 jar tf | grep 'myClass'
O problema é que não consigo ver onde jar
ele está localizado.
Estou procurando uma solução para exibir o nome do arquivo no meu terminal. Minha saída atual é assim:
[user@server lib]$ find -name "*.jar" | xargs -n 1 jar tf | grep 'RollOn'
com/ventyx/utils/logutils/rolling/RollOnDemandAppender.class
Alguma sugestão?
Responder1
Com GNU grep
:
find . -type f -name '*.jar' -exec sh -c '
for file do
jar tf "$file" | grep -H --label="$file" myClass
done' sh {} +
Ou use awk, por exemplo:
find . -type f -name '*.jar' -exec sh -c '
export FILE
for FILE do
jar tf "$FILE" | awk '\''/myClass/ {
print ENVIRON["FILE"] ": " $0}'\''
done' sh {} +
Você também pode usar bsdtar
(já que jar
arquivos são zip
arquivos e bsdtar
os suporta) para fazer a correspondência por si só (permitindo que você tenha uma saída mais detalhada com metadados de arquivos sem correr o risco de grep
corresponder a esses metadados), embora ainda precise de algo como grep
para inserir o nome do arquivo:
find . -type f -name '*.jar' -exec sh -c '
for file do
bsdtar tvf "$file" "*myClass*" | grep -H --label="$file" "^"
done' sh {} +
Responder2
Uma maneira de fazer isso:
find . -type f -name '*.jar' -exec \
sh -c 'jar tf "$1" | grep -q "$2" && printf -- '%s\n' "$1"' sh {} 'RollOn' \;
Responder3
Com festa:
shopt -s globstar
for file in **/*jar; do
jar tf "$file" | grep -q 'myClass' && printf '%s\n' "$file"
done
Ou, para imprimir o nome do arquivo e a linha correspondente:
shopt -s globstar
for file in **/*jar; do
jar tf "$file" | awk -vf="$file" '/myClass/{print f":"$0}'
done