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的文件,而不是使用antmake]

的问题是,它的速度太慢,需要大约275ms。如何使它更快吗?

或者是有一个更快的方式在bash做到这一点?我看不出如何与finddiffrsync也不make做到这一点(这似乎并没有自动遍历树,需要明确列出的源文件)。

有帮助吗?

解决方案

尝试这样:

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

其他提示

我不知道这一结构将是任何更快,但它可能是值得一试:

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呼叫做出的最大区别。

蚁执行智能建筑逻辑,它不会建立一个类除非源已被修改。

您也可能想看看scons的是不是一个原生的Java构建工具,但是是非常方便的在编译高效复杂的构建树木确实有Java的建设者为好。

采用Kon的方法的文件名改写(munging),速度提高了从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

原来是有点慢现在(是275ms;现在320ms);我不知道为什么。我使用的是同一条线路。也许不同系统资源播放视频之后。

修改的重新RST的评论:重整的 “SRC /” 之外,而不是cd src; ... cd -;。注意,这两个$n$n2使用[你不能嵌套$ {VAR / A / B}结构,可以吗?]

for n in `find src -name "*.java"`; do
  n2=${n/src/}
  if [[ $n -nt build/${n2/.java/.class} ]];
     then echo $n;
  fi;
done
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top