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
它列出了src树中的所有java文件;然后对于每一个,它删除后缀“.java”(cut -d '.' -f2
,因为find .
输出前缀为.
)。然后使用-nt
来测试src树中的java文件是否比构建树中的相应类文件更新;如果它更新,则输出。 [javac然后可以使用它来编译所需的src文件,而不是使用ant
或make
]
问题是它太慢了,大概需要275ms。如何让它更快?
或者在bash中有更快的方法吗?我无法看到如何使用find
,diff
,rsync
和make
(它似乎不会自动遍历树,并且需要明确列出的源文件) )。
答案 0 :(得分:1)
试试这个:
for f in src/*.java; do
file=`basename $f`;
if [[ src/$file -nt build/${file//.java/} ]]; then
echo src/$file;
fi;
done
答案 1 :(得分:1)
我不知道这种结构是否会更快,但值得一试:
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")
while
表单可能不会提供任何提升。折叠的if
可以。正则表达式可能会提供一些小的贡献。
正如您所发现的那样,取消对cut
的呼叫已经发挥了最大的作用。
答案 2 :(得分:0)
采用kon对文件名重叠的方法,平均速度从320ms提高到45ms。谢谢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
现在原来有点慢(是275毫秒;现在是320毫秒);我不知道为什么。我正在使用同一条线。播放视频后可能会有不同的系统来源。
编辑重新评论:将“src /”改为cd src;
而不是cd -;
。$n
。请注意,$n2
和for n in `find src -name "*.java"`; do
n2=${n/src/}
if [[ $n -nt build/${n2/.java/.class} ]];
then echo $n;
fi;
done
都被使用[你无法嵌套$ {var / A / B}构造,是吗?]
{{1}}
答案 3 :(得分:0)
ant执行智能构建逻辑,除非源被修改,否则它不会构建类。
您可能还想查看不是本机Java构建工具的scons,但是在编译高效的复杂构建树时非常方便,并且也有java构建器。