Estoy tratando de descompilar todas las clases de Java contenidas en un determinado directorio, comenzando en la parte superior del directorio.
El directorio tiene muchos subdirectorios y la profundidad de cada uno es diferente.
Lo que quiero hacer es ir a cada directorio y si el contenido es un archivo con sufijo .class
, ejecute el comando descompilador, que creará un archivo descompilado en el mismo directorio.
He intentado lo siguiente pero no logran lo que busco.
El primer método fue:
for dir in ./*; do ( ( if [[ -d $dir ]]; then cd "$dir"; fi ) && ( for f in "$dir"; do ( if [[ -f $f && $f == *".class"* ]]; then jad "$f"; fi ); done ) ); done
El problema aquí es que no es recursivo. ¿Tal vez esto se pueda modificar de una manera que sea recursiva?
El segundo método era mucho más simple, pero genera los archivos en el directorio superior. Si bien esto podría estar bien, desafortunadamente, tengo clases que tienen los mismos nombres, pero en diferentes paquetes, por lo que esta solución tampoco funciona:
find . -type f -name "*.class" | while read filename; do echo $filename; done
¿Se puede ajustar uno de estos para lograr lo que quiero? ¿Cómo se puede convertir el primer comando en una operación recursiva?
.class
archivos y luego ejecuta un comando que generará la salida descompilada de JAD en el directorio principal de ese.class
archivo.while IFS= read -r class
o algo. Es una buena práctica usar solo nombres en mayúsculas para variables de entorno, y configurar IFS + usando-r
evita algunos problemas . Sin embargo, hay otras formas mejores de resolver este problema, por ejemplo, la mía que solo paga los gastos generales de inicio de jad una vez por directorio en lugar de una vez por archivo. (O una vez para todo el árbol si la**
expansión incorporada de jad hace lo que el OP necesita).jad tiene soporte para este incorporado , de acuerdo con la documentación . Expandirá los globos para ti, incluidos
**
los globos recursivos. Por lo tanto, use comillas para protegerlos del shell, como este ejemplo cmd copiado de los documentos:Esta es casi seguramente la mejor opción si le gustan sus opciones de estructura de directorios. Parece que sin
-r
él no se convertirá la estructura del paquete en directorios. IDK si pudiera conseguir que coloque los.java
archivos al lado de los.class
archivos con su estructura de directorios.Utilizando
find -execdir
para ejecutar jad en el directorio correcto :Esto será efectivo
cd
para cada directorio que contenga al menos uno.class
, y haga el equivalente de ejecutarsejad *.class
allí. (Tenga+
en cuenta que en lugar de\;
agrupar múltiples argumentos en un solo comando).GNU
find
es poderoso; lea la página del manual .O use las funciones de bash :
Como estás usando bash, puedes hacer
for dir in ./*
recursivo con la función globstar de bash. Es significativamente más lento quefind
para los grandes árboles de directorios, porque bash no sabe aprovechar la sugerencia de tipo de archivo devueltareaddir
para evitar tener que acceder alstat
cada entrada de directorio para ver si es un directorio. Pero los globos recursivos bash pueden ser útiles.Tenga en cuenta el uso de una barra inclinada final para que el globo solo coincida con los directorios.
fuente
Se me ocurrió una solución que funcionó para mí:
No se
if
necesita ninguna declaración para verificar el tipo correcto de archivo porque jad no realizará la descompilación si el archivo no es un archivo de clase.fuente