[bash] كيف نحسب جميع سطور الكود في الدليل بشكل متكرر؟


Answers

لواحد آخر لاينر:

( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l

يعمل على أسماء ذات مسافات ، فقط يخرج رقم واحد.

Question

لدينا تطبيق PHP ونريد أن نحسب جميع سطور الكود تحت دليل معين والدلائل الفرعية الخاصة به. لا نحتاج إلى تجاهل التعليقات ، لأننا نحاول الحصول على فكرة تقريبية.

wc -l *.php 

يعمل هذا الأمر بشكل رائع داخل دليل معين ، ولكنه يتجاهل الدلائل الفرعية. كنت أفكر أن هذا قد ينجح ، لكنه يعود 74 ، وهذا بالتأكيد ليس هو الحال ...

find . -name '*.php' | wc -l

ما هي الصيغة الصحيحة لإدخالها في جميع الملفات؟




بينما أنا أحب البرامج النصية أنا أفضل هذا واحد كما أنه يظهر أيضا ملخص لكل ملف ما دام المجموع

wc -l `find . -name "*.php"`



POSIX

خطوط في كل ملف:

find . -name '*.php' -type f | xargs wc -l

خطوط في كل ملف ، مرتبة حسب مسار الملف

find . -name '*.php' -type f | sort | xargs wc -l

خطوط في كل ملف ، مرتبة حسب عدد الأسطر ، تنازلي

find . -name '*.php' -type f | xargs wc -l | sort -nr

مجموع الخطوط في جميع الملفات

find . -name '*.php' -type f | xargs cat | wc -l






بعد أمر آخر للحصول على مجموع كل الملفات (لينكس بالطبع)

find ./ -type f -exec wc -l {}  \; | cut -d' ' -f1 | paste -sd+ | bc

الفرق الرئيسي من الإجابات الأخرى:

  1. باستخدام find -exec ،
  2. باستخدام معجون (مع قطع) ،
  3. باستخدام قبل الميلاد



إعطاء أطول الملفات أولاً (على سبيل المثال ، ربما تحتاج هذه الملفات الطويلة إلى بعض إعادة بناء الحب؟) ، واستبعاد بعض أدلة الموردين:

 find . -name '*.php' | xargs wc -l | sort -nr | egrep -v "libs|tmp|tests|vendor" | less



واحد بسيط وسريع ، سيستخدم كل قوة البحث / التصفية find ، ولن يفشل عندما يكون هناك الكثير من الملفات (تجاوز عدد الحجج) ، والعمل بشكل جيد مع الملفات ذات الرموز المضحكة في أسمائهم ، دون استخدام xargs ، لن إطلاق عدد كبير من الأوامر الخارجية -exec (بفضل + find -exec ). ها أنت ذا:

find . -name '*.php' -type f -exec cat -- {} + | wc -l



هناك أداة صغيرة تسمى sloccount لحساب خطوط التعليمات البرمجية في الدليل. تجدر الإشارة إلى أنها تقوم بأكثر مما تريد حيث تتجاهل الخطوط / التعليقات الفارغة ، وتجمع النتائج لكل لغة برمجة وتحسب بعض الإحصائيات.




WC -L؟ أفضل استخدام GREP -C ^

wc -l؟ خطأ! يحسب أمر wc رموز خطوط جديدة ، وليس خطوطًا! عندما لا ينتهي السطر الأخير في الملف برمز سطر جديد ، لن يتم حساب ذلك!

إذا كنت لا تزال تريد حساب خطوط ، استخدم grep -c ^ ، مثال كامل:

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED:  $total

أخيرا ، احترس من فخ wc -l (يدخل التهم ، وليس خطوط !!!)




لدي صندوق مشغول مثبت على نظام النوافذ الخاص بي. إذن هذا ما فعلته.

ECHO OFF
for /r %%G in (*.php) do (
busybox grep . "%%G" | busybox wc -l
) 



لم تحدد عدد الملفات الموجودة أو ما هو الناتج المطلوب. هل هذا ما كنت تبحث عنه:

find . -name '*.php' | xargs wc -l



إذا كنت تحتاج فقط إلى إجمالي عدد الأسطر في دعنا نقول ملفات PHP الخاصة بك ، يمكنك استخدام أمر سطر واحد بسيط للغاية حتى في ظل Windows إذا كان GnuWin32 مثبتًا لديك. مثله:

cat `/gnuwin32/bin/find.exe . -name *.php` | wc -l

تحتاج إلى تحديد مكان find.exe وإلا فإن Windows يوفر FIND.EXE (من الأوامر DOS-like القديمة) سيتم تنفيذه ، لأنه ربما قبل GnuWin32 في بيئة PATH ، ولديه معلمات ونتائج مختلفة.

يرجى ملاحظة أنه في الأمر أعلاه يجب عليك استخدام علامات الاقتباس ، وليس اقتباسات مفردة.




يمكنك استخدام الأداة cloc.sourceforge.net المبنية لهذا الغرض بالتحديد. تقوم بالإبلاغ عن كل عدد من الخطوط في كل لغة ، بالإضافة إلى عدد هذه التعليقات أو ما إلى ذلك.

مثال على الاستخدام والإخراج:

$ cloc --exclude-lang=DTD,Lua,make,Python .
    2570 text files.
    2200 unique files.                                          
    8654 files ignored.

http://cloc.sourceforge.net v 1.53  T=8.0 s (202.4 files/s, 99198.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                    1506          77848         212000         366495
CSS                             56           9671          20147          87695
HTML                            51           1409            151           7480
XML                              6           3088           1383           6222
-------------------------------------------------------------------------------
SUM:                          1619          92016         233681         467892
-------------------------------------------------------------------------------



ببساطة شديدة

find /path -type f -name "*.php" | while read FILE
do
    count=$(wc -l < $FILE)
    echo "$FILE has $count lines"
done



ما تريده هو بسيط للحلقة:

total_count=0
for file in $(find . -name *.php -print)
do
count=$(wc -l $file)
let total_count+=count
done
echo $total_count





Related



Tags

bash bash   shell