معنى - git bash




كيف نحسب جميع سطور الكود في الدليل بشكل متكرر؟ (20)

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 (يدخل التهم ، وليس خطوط !!!)

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

wc -l *.php 

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

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

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


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

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

wc `find . -name '*.[h|c|cpp|php|cc]'`

أمر مختلف:

wc -l `tree -if --noreport | grep -e'\.php$'`

يعمل هذا بشكل جيد ، ولكنك تحتاج إلى ملف *.php واحد على الأقل في المجلد الحالي أو أحد مجلداته الفرعية ، أو ما عدا الأكشاك الأخرى


إذا كنت تريد فرز النتائج حسب عدد الأسطر ، فيمكنك فقط إضافة | sort | sort أو | sort -r | sort -r ( -r لترتيب تنازلي) إلى الإجابة الأولى ، مثل:

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

إذا كنت تستخدم إصدارًا حديثًا لائقًا من Bash (أو ZSH) ، فسيكون ذلك أبسط بكثير:

wc -l **/*.php

في shell Bash ، يتطلب ذلك globstar خيار globstar ، وإلا فلن يكون عامل التشغيل globstar ** متكرراً. لتمكين هذا الإعداد ، قم بإصداره

shopt -s globstar

لجعل هذا دائم ، إضافته إلى أحد ملفات التهيئة ( ~/.bashrc ، ~/.bash_profile إلخ.).


بالنسبة إلى Windows ، فإن الأداة سهلة وسريعة هي LocMetrics .


ببساطة شديدة

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

بعد اختلاف آخر :)

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

تعديل: سيعطي هذا المبلغ الإجمالي ، بدلاً من الملف الواحد تلو الآخر.


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

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

على أنظمة تشبه UNIX ، هناك أداة تسمى cloc الذي يوفر إحصائيات الكود.

ركضت في دليل عشوائي في قاعدة الكود لدينا تقول:

      59 text files.
      56 unique files.                              
       5 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (108.0 files/s, 50180.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               36           3060           1431          16359
C/C++ Header                    16            689            393           3032
make                             1             17              9             54
Teamcenter def                   1             10              0             36
-------------------------------------------------------------------------------
SUM:                            54           3776           1833          19481
-------------------------------------------------------------------------------

لا أعتقد أن أحدًا سيشاهد هذا المدفون في الخلف ... لكن لا أحد من الإجابات حتى الآن يواجه مشكلة أسماء الملفات بمسافات. بالإضافة إلى ذلك ، كل تلك الاستخدامات xargs تكون عرضة للفشل إذا تجاوز إجمالي طول المسارات في الشجرة حد حجم بيئة shell (الافتراضي إلى عدة ميغابايت في Linux). هنا واحد الذي يصلح هذه المشاكل بطريقة مباشرة جميلة. تهتم subshell الملفات مع مسافات. تقوم awk بإجمالي تدفق مخرجات wc الفردية للملف ، لذا يجب ألا تنفد المساحة. كما أنه يقيد exec إلى الملفات فقط (تخطي الدلائل):

find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}' 

لقد استخدمت هذا البرنامج النصي المضمن الذي أقوم بتشغيله من دليل src-project:

 for i in $(find . -type f); do rowline=$(wc -l $i | cut -f1 -d" "); file=$(wc -l $i | cut -f2 -d" "); lines=$((lines + rowline)); echo "Lines["$lines"] " $file "has "$rowline"rows."; done && unset lines

التي تنتج هذا الإخراج:

Lines[75]  ./Db.h has 75rows.
Lines[143]  ./Db.cpp has 68rows.
Lines[170]  ./main.cpp has 27rows.
Lines[294]  ./Sqlite.cpp has 124rows.
Lines[349]  ./Sqlite.h has 55rows.
Lines[445]  ./Table.cpp has 96rows.
Lines[480]  ./DbError.cpp has 35rows.
Lines[521]  ./DbError.h has 41rows.
Lines[627]  ./QueryResult.cpp has 106rows.
Lines[717]  ./QueryResult.h has 90rows.
Lines[828]  ./Table.h has 111rows.

للمصادر فقط:

wc `find`

لتصفية ، مجرد استخدام grep

wc `find | grep .php$`

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

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

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


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

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

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

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

والمثير للدهشة أنه لا توجد إجابة تستند إلى " -exec و " awk . ها نحن ذا:

find . -type f -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }'

يجد هذا المقتطف لجميع الملفات ( -type f ). للبحث عن طريق ملحق الملف ، استخدم -name :

find . -name *.py -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }'

يمكنك استخدام الأداة 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 . -name '*.php' | xargs wc -l

قد تساعد الأداة SLOCCount كذلك.

ستوفر خطوط مصدر دقيقة لعدد الرموز لأي تسلسل هرمي توجهه إليه ، بالإضافة إلى بعض الإحصاءات الإضافية.





shell