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
В нем перечислены все java-файлы в дереве src; то для каждого из них он удаляет суффикс «.java» (cut -d '.' -f2
, потому что вывод find .
имеет префикс .
). Затем он использует -nt
для проверки того, является ли java-файл в дереве src более новым, чем соответствующий файл класса в дереве сборки; если он новее, он выводится. [javac может затем использовать это, чтобы скомпилировать только необходимые файлы src, вместо использования ant
или make
]Как можно сравнить эти временные метки src и build tree?
Проблема в том, что она слишком медленная, занимает около 275 мс. Как сделать это быстрее?
Или есть более быстрый способ сделать это в bash? Я не вижу, как это сделать с find
, diff
, rsync
или make
(который, кажется, не пересекает деревья автоматически и нуждается в явно перечисленных исходных файлах).
Это не будет рекурсивно обрабатывать поддиры src. –
Я думаю, вы имеете в виду $ {file/.java/.class} в подстановке? –
Спасибо, мне нравятся 'basename $ f' и' $ {file //. Java /} '- я их не знал! В последнем, я думаю, вы имели в виду 'build/$ {file/.java/.class}'. Но 'src/*. Java' и' basename' охватывают только один уровень, а не дерево src (например, вложенные пакеты). – 13ren