Domanda

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

E 'elenca tutti i file Java nell'albero src; poi per ognuno, rimuove il suffisso ".java" (cut -d '.' -f2 perché uscita find . è preceduto .). Viene quindi utilizzato -nt per verificare se il file java nell'albero src è più recente del file di classe corrispondente nella albero di compilazione; se è più recente, è uscita. [Javac può quindi utilizzare questo per compilare solo i file src necessari, invece di utilizzare ant o make]

Il problema è che è troppo lento, prendendo circa 275ms. Come per renderlo più veloce?

O c'è un modo più veloce per fare questo in bash? Non riesco a vedere come si fa con find, diff, rsyncmake (che non sembra attraversare automaticamente gli alberi, e ha bisogno esplicitamente elencati i file di origine).

È stato utile?

Soluzione

provare questo:

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

Altri suggerimenti

Non so se questa struttura sarebbe più veloce, ma potrebbe essere la pena di provare:

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")

La forma while probabilmente non fornirà alcun impulso. Il if compresso può. La regex potrebbe fornire un piccolo contributo.

Come hai scoperto, eliminando una chiamata a cut ha fatto la differenza più grande.

formica esegue logica intelligente dell'edificio, non costruire una classe meno che l'origine è stata modificata.

Ti potrebbe piacere anche a guardare in scons, che non è uno strumento di generazione Java nativo, ma è molto utile alla compilazione efficienti alberi costruire complessi e ha costruttore java pure.

Adottando l'approccio di kon al munging nome del file, la velocità migliora da 320ms a 45ms in media. Grazie 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

L'originale è un po 'più lento ora (era 275ms, ora 320ms); Non so perché. Sto utilizzando la stessa linea. Forse diverse fonti del sistema dopo la riproduzione di un video.

Modifica re commento di prima: pressare il "src /" lontano invece di cd src; ... cd -;. Si noti che sia $n e $n2 sono utilizzati [non è possibile nido il $ {var / A / B} costruire, si può?]

for n in `find src -name "*.java"`; do
  n2=${n/src/}
  if [[ $n -nt build/${n2/.java/.class} ]];
     then echo $n;
  fi;
done
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top