0
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いるためです。次に、srcツリーのjavaファイルがビルドツリーの対応するクラスファイルよりも新しいかどうかをテストするために使用します。新しい場合は出力されます。[javacは、またはを使用する代わりに、これを使用して必要なsrcファイルのみをコンパイルできます]find ..-ntantmake

問題は、それが遅すぎて、約275msかかることです。それを速くする方法は?

または、bashでこれを行うより速い方法はありますか?、、、またはを使用してそれfindを行う方法がわかりません(これはツリーを自動的にトラバースしないようであり、明示的にリストされたソースファイルが必要です)。diffrsyncmake

4

4 に答える 4

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が最大の違いをもたらしました。

于 2009-12-04T13:54:28.103 に答える
1

これを試して:

for f in src/*.java; do 
  file=`basename $f`; 
  if [[ src/$file -nt build/${file//.java/} ]]; then 
     echo src/$file; 
  fi; 
done 
于 2009-12-04T11:39:33.550 に答える
0

ファイル名の変更にkonのアプローチを採用すると、速度は平均で320msから45msに向上します。ありがとうコン!

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)。どうしてか分かりません。私は同じ行を使用しています。ビデオを再生した後、おそらく異なるシステムソース。

最初のコメントを編集cd src;します: ...の代わりに「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
于 2009-12-04T12:24:39.220 に答える
0

antはスマートビルディングロジックを実行します。ソースが変更されない限り、クラスはビルドされません。

また、ネイティブJavaビルドツールではありませんが、効率的な複雑なビルドツリーをコンパイルするのに非常に便利で、Javaビルダーも備えているsconsを調べることもできます。

于 2009-12-04T12:47:40.920 に答える