O
jad tem suporte para este , de acordo com a documentação . Ele expandirá globs para você, incluindo **
recursive globs. Portanto, use aspas para protegê-las do shell, como neste exemplo cmd copiado dos documentos:
jad -o -r -sjava -dsrc 'tree/**/*.class'
This command decompiles all .class files located in all
subdirectories of tree
and creates output files in subdirectories of
src
according to package names of classes. For example, if file
tree/a/b/c.class
contains class c
from package a.b
, then output
file will have a name src/a/b/c.java
.
Esta é quase certamente a melhor opção se você gosta de suas opções de estrutura de diretórios. Parece que sem -r
não vai transformar a estrutura de pacotes em diretórios. IDK se você conseguisse colocar os arquivos .java
próximos aos arquivos .class
com sua estrutura de diretório.
Usando find -execdir
para executar o jad no diretório correto :
# untested
find [more find options] -name '*.class' -execdir jad {} +
Isso será efetivamente cd
para cada diretório que contenha pelo menos um .class
e faça o equivalente a executar jad *.class
. (Observe o +
em vez de \;
para agrupar vários argumentos em um comando).
GNU find
é poderoso; leia a página de manual .
Ou use recursos bash :
Como você está usando o bash, você pode tornar for dir in ./*
recursiva com o recurso globstar do bash. É significativamente mais lento que find
para árvores de diretórios grandes, porque bash não sabe aproveitar a dica de tipo de arquivo retornada por readdir
para evitar ter que lstat
toda entrada de diretório para ver se é um diretório. Mas bash recursive globs pode ser útil.
# untested
shopt -s globstar # put this in your .bashrc if you want it enabled all the time
for dir in ./**/; do
pushd "$dir"
classfiles=( *.class ) # expand the glob into an array
[[ -e $classfiles ]] && # test the first element of the array. Will fail if *.class didn't match anything.
jad *.class
popd "$dir"
done
Observe o uso de uma barra à direita para tornar os glob apenas diretórios correspondentes.