Obtenga el nombre del archivo después de buscar -nombre | xargos

Obtenga el nombre del archivo después de buscar -nombre | xargos

Tengo un directorio jar múltiple en el que me gustaría ubicar algunas clases. Encontré una solución para ver si existe una clase con el siguiente comando:

find -name "*.jar" | xargs -n 1 jar tf | grep 'myClass'

El problema es que no puedo ver en qué jarse encuentra.

Estoy buscando una solución para mostrar el nombre del archivo en mi terminal. Mi salida actual es así:

[user@server lib]$ find -name "*.jar" | xargs -n 1 jar tf | grep  'RollOn'  
com/ventyx/utils/logutils/rolling/RollOnDemandAppender.class

¿Alguna sugerencia?

Respuesta1

Con GNU grep:

find . -type f -name '*.jar' -exec sh -c '
   for file do
     jar tf "$file" | grep -H --label="$file" myClass
   done' sh {} +

O use awk por ejemplo:

find . -type f -name '*.jar' -exec sh -c '
   export FILE
   for FILE do
     jar tf "$FILE" | awk '\''/myClass/ {
       print ENVIRON["FILE"] ": " $0}'\''
   done' sh {} +

También puede usar bsdtar(ya que jarlos archivos son ziparchivos y bsdtarlos admite) para hacer la comparación por sí solo (lo que le permite tener una salida más detallada con los metadatos de los archivos sin correr el riesgo de grephacer coincidir esos metadatos), aunque aún necesitaría algo como greppara insertar el nombre del archivo:

find . -type f -name '*.jar' -exec sh -c '
   for file do
     bsdtar tvf "$file" "*myClass*" | grep -H --label="$file" "^"
   done' sh {} +

Respuesta2

Una forma de hacerlo:

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

Respuesta3

Con fiesta:

shopt -s globstar
for file in **/*jar; do
    jar tf "$file" | grep -q 'myClass' && printf '%s\n' "$file"
done

O bien, para imprimir tanto el nombre del archivo como la línea coincidente:

shopt -s globstar
for file in **/*jar; do
    jar tf "$file" | awk -vf="$file" '/myClass/{print f":"$0}'
done

información relacionada