Pergunta

for n in `cd src; find . -name "*.java"; cd -`;
  do a=`echo $n | cut -d '.' -f2`;
  if [[ src/$a.java -nt build/$a.class ]];
    then echo src/$a.java;
  fi;
done

Ele lista todos os arquivos java na árvore src; em seguida, para cada uma, remove o sufixo ".Java" (cut -d '.' -f2 porque saída find . é prefixado com .). Em seguida, usa -nt para testar se o arquivo java na árvore src é mais recente que o arquivo de classe correspondente na árvore de construção; se ele é mais recente, é de saída. [Javac pode então usar isso para compilar apenas os arquivos src necessários, em vez de usar ant ou make]

O problema é que ele é muito lento, levando cerca de 275ms. Como torná-lo mais rápido?

Ou há uma maneira mais rápida de fazer isso em bash? Eu não posso ver como fazê-lo com find, diff, rsync nem make (que não parece atravessar árvores automaticamente e necessidades listadas explicitamente arquivos de origem).

Foi útil?

Solução

tente o seguinte:

for f in src/*.java; do 
  file=`basename $f`; 
  if [[ src/$file -nt build/${file//.java/} ]]; then 
     echo src/$file; 
  fi; 
done 

Outras dicas

Eu não sei se esta estrutura seria mais rápido, mas pode valer a pena tentar:

while read n
do
     # capture the basename all at once
     [[ $n =~ src/(.*)\.java ]]   # escape the parentheses for Bash < 3.2 (or thereabouts)
     [[ $n -nt "build/${BASH_REMATCH[1]}.class" ]] && echo $n
done < <(find src -name "*.java")

A forma while provavelmente não vai fornecer qualquer impulso. O colapso pode if. A regex pode fornecer uma pequena contribuição.

Como você descobriu, eliminando uma chamada para cut fez a maior diferença.

executa formiga lógica inteligente edifício, não vai construir uma classe, a menos que a fonte foi modificado.

Você também pode gostar de olhar para scons que não é uma ferramenta nativa de construção Java, mas é muito útil na compilação de árvores construir complexo eficientes e tem java construtor também.

Adotando a abordagem de kon ao munging nome do arquivo, a velocidade melhora de 320ms para 45ms em média. Graças kon!

for n in `cd src; find . -name "*.java"; cd -`; do
  if [[ src/$n -nt build/${n/.java/.class} ]];
     then echo src/$n;
  fi;
done

O original é um pouco mais lento agora (foi 275ms; agora 320ms); Eu não sei por quê. Eu estou usando a mesma linha. Talvez diferentes fontes sistema após a reprodução de um vídeo.

Editar re do primeiro comentário: desconfiguração do "src /" longe em vez de cd src; ... cd -;. Note-se que tanto $n e $n2 são usados ??[você não pode ninho $ {var / A / B} construção, pode?]

for n in `find src -name "*.java"`; do
  n2=${n/src/}
  if [[ $n -nt build/${n2/.java/.class} ]];
     then echo $n;
  fi;
done
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top