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
Il répertorie tous les fichiers Java dans l'arborescence src; puis pour chacun d'eux, il supprime le suffixe « .java » (cut -d '.' -f2
parce find .
sortie est préfixé avec .
). Il utilise ensuite -nt
pour tester si le fichier java dans l'arborescence src est plus récent que le fichier de classe correspondant dans l'arbre de construction; s'il est plus récent, il est sorti. [javac peut alors utiliser ceci pour compiler seulement les fichiers src nécessaires, au lieu d'utiliser ant
ou make
]Comment cette comparaison entre src et build tree timestamp peut-elle être plus rapide?
Le problème est qu'il est trop lent, prenant environ 275ms. Comment faire plus vite?
Ou est-il un moyen plus rapide de le faire en bash? Je ne vois pas comment le faire avec find
, diff
, ni rsync
make
(qui ne semble pas traverser les arbres automatiquement, et les besoins des fichiers source répertoriés explicitement).
Cela ne traitera pas récursivement les sous-répertoires de src. –
Je pense que vous voulez dire $ {fichier/.java/.class} dans la substitution? –
Merci, j'aime le 'basename $ f' et' $ {fichier // .java /} '- je ne les connaissais pas! Dans ce dernier, je pense que vous vouliez dire 'build/$ {file/.java/.class}'. Mais 'src/* .java' et' basename' ne couvrent qu'un niveau, pas un arbre src (par exemple des paquets imbriqués). – 13ren