Frage

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

Es listet alle Java-Dateien im src Baum; dann für jeden einzelnen, entfernt es das Suffix „.java-“ (cut -d '.' -f2 weil find . Ausgang mit . vorangestellt wird). Es verwendet dann -nt zu testen, ob die Java-Datei im src Baum neuer als die entsprechende Klassendatei in dem Build-Baum ist; wenn es neuer ist, ist es ausgegeben. [Javac kann dann diese nur die benötigten src-Dateien zu kompilieren, anstelle der Verwendung von ant oder make]

Das Problem ist, dass es zu langsam ist, nimmt etwa 275ms. Wie machen es schneller?

Oder gibt es einen schnelleren Weg, dies in bash zu tun? Ich kann nicht sehen, wie es zu tun mit find, diff, rsync noch make (die nicht auf Bäume zu durchlaufen automatisch scheinen, und muß explizit Quelldateien aufgelistet).

War es hilfreich?

Lösung

versuchen Sie dies:

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

Andere Tipps

Ich weiß nicht, ob diese Struktur nicht schneller sein würde, aber es könnte einen Versuch wert sein:

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

Die while Form vermutlich jeden Schub nicht bieten. Die kollabierten if kann. Die Regex könnte einen kleinen Beitrag liefern.

Wie Sie herausgefunden haben, um einen Anruf zu cut Beseitigung des größten Unterschied gemacht hat.

ant führt intelligente Gebäude Logik, es wird nicht eine Klasse bauen, wenn die Quelle geändert wurde.

Sie können auch in scons aussehen mag, die keine native Java Build-Tool ist aber sehr praktisch, um effizient komplexe Build-Bäume Kompilieren und tut auch Java-Builder haben.

Die Annahme kon Ansatz an den Dateinamen munging, verbessert die Geschwindigkeit von 320 ms bis 45 ms im Durchschnitt. Dank 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

Das Original etwas langsamer jetzt ist (war 275ms, jetzt 320 ms); Ich weiß nicht, warum. Ich bin mit der gleichen Zeile. Vielleicht verschiedenen Systemquellen nach der Wiedergabe eines Videos.

EDIT re ersten Kommentar: das "src /" entfernt statt cd src; Mangeln ... cd -;. Beachten Sie, dass beide $n und $n2 verwendet werden [Sie können nicht verschachtelt werden die $ {var / A / B} konstruieren, können Sie?]

for n in `find src -name "*.java"`; do
  n2=${n/src/}
  if [[ $n -nt build/${n2/.java/.class} ]];
     then echo $n;
  fi;
done
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top