Получить имя файла после find -name | xargs

Получить имя файла после find -name | xargs

У меня есть несколько каталогов 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

Какие-либо предложения?

решение1

С 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 {} +

решение2

Один из способов сделать это:

find . -type f -name '*.jar' -exec \
    sh -c 'jar tf "$1" | grep -q "$2" && printf -- '%s\n' "$1"' sh {} 'RollOn' \;

решение3

С помощью 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

Связанный контент