Obtém o nome do arquivo depois de find -name | xargs

3

Eu tenho um diretório multiple jar no qual eu gostaria de localizar algumas classes. Eu 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 em qual jar está localizada.

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?

    
por Calliste Hanriat 01.06.2017 / 10:32

3 respostas

9

Com o 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 o 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 (como jar arquivos são zip arquivos e bsdtar os suporta) para fazer a correspondência sozinho (permitindo que você tenha uma saída mais detalhada com metadados de arquivos sem correr o risco de grep correspondente a esses metadados), embora você ainda precisasse 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 {} +
    
por 01.06.2017 / 10:48
3

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' \;
    
por 01.06.2017 / 10:38
3

Com bash:

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
    
por 01.06.2017 / 10:56