문제

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 (트리를 자동으로 가로 지르는 것처럼 보이고 명시 적으로 나열된 소스 파일이 필요합니다).

도움이 되었습니까?

해결책

이 시도:

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 5월. REGEX는 작은 기여를 제공 할 수 있습니다.

당신이 알았 듯이, 전화를 제거합니다 cut 가장 큰 차이를 만들었습니다.

개미는 스마트 빌딩 로직을 수행하며 소스가 수정되지 않으면 클래스를 구축하지 않습니다.

네이티브 Java 빌드 도구가 아닌 스콘을 살펴보고 효율적인 복잡한 빌드 트리를 컴파일하는 데 매우 편리하며 Java Builder도 있습니다.

Filename Munging에 대한 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

원본은 이제 약간 느립니다 (275ms; 현재 320ms). 왜 그런지 모르겠어요. 같은 줄을 사용하고 있습니다. 비디오를 재생 한 후 다른 시스템 소스 일 수 있습니다.

편집하다 Re 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