سؤال

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

يسرد جميع ملفات Java في شجرة SRC؛ ثم لكل واحد، فإنه يزيل لاحقة ".java" (cut -d '.' -f2 لأن find . الإخراج مسبق .). ثم يستخدم -nt لاختبار ما إذا كان ملف Java في شجرة SRC أحدث من ملف الفئة المقابلة في شجرة البناء؛ إذا كان الأحدث، فهو إخراج. [يمكن Javac بعد ذلك استخدام هذا لتجميع ملفات SRC المطلوبة فقط، بدلا من استخدام ant أو make]

المشكلة هي أنه بطيء جدا، وأخذ حوالي 275 ميلا. كيف تجعلها أسرع؟

أم أن هناك طريقة أسرع للقيام بذلك في باش؟ لا أستطيع أن أرى كيفية القيام بذلك 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 مايو. قد يوفر Regex مساهمة صغيرة.

كما اكتشفت، والقضاء على مكالمة إلى cut جعلت الفرق الأكبر.

ينفذ النملة منطق بناء ذكي، فلن يقوم ببناء فئة ما لم يتم تعديل المصدر.

قد ترغب أيضا في النظر في Scons وهي ليست أداة بناء جافا الأصلية ولكنها مفيدة للغاية في تجميع أشجار البناء المعقدة الفعالة ولديها Java Builder أيضا.

تبني نهج Kon في Munging اسم الملف، والسرعة تتحسن من 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

الأصلي أبطأ قليلا الآن (كان 275 مللي ثانية؛ الآن 320ms)؛ أنا لا أعرف لماذا. أنا أستخدم نفس الخط. ربما مصادر النظام المختلفة بعد لعب الفيديو.

تعديل إعادة صياغة تعليق: تشاجر "SRC /" بعيدا بدلا من cd src; ... cd -;. وبعد لاحظ أن كلاهما $n و $n2 يتم استخدامها [لا يمكنك تداها بناء $ {var / a / b / 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