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é jar
se 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 jar
los archivos son zip
archivos y bsdtar
los 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 grep
hacer coincidir esos metadatos), aunque aún necesitaría algo como grep
para 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