วิธีการนับบรรทัดของรหัสทั้งหมดในไดเรกทอรีซ้ำ?


1623

เรามีแอปพลิเคชั่น PHP และต้องการนับจำนวนบรรทัดทั้งหมดภายใต้ไดเรกทอรีเฉพาะและไดเรกทอรีย่อย เราไม่จำเป็นต้องเพิกเฉยต่อความคิดเห็นเนื่องจากเรากำลังพยายามทำความเข้าใจคร่าวๆ

wc -l *.php 

คำสั่งนั้นใช้งานได้ดีในไดเรกทอรีที่กำหนด แต่ไม่สนใจไดเรกทอรีย่อย ฉันคิดว่ามันอาจใช้งานได้ แต่มันกลับมา 74 ซึ่งไม่ใช่กรณี ...

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

ไวยากรณ์ที่ถูกต้องในฟีดคืออะไร?

คำตอบ:


2649

ลอง:

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

เครื่องมือ SLOCCountอาจช่วยได้เช่นกัน

มันจะให้บรรทัดซอร์สที่ถูกต้องของการนับรหัสสำหรับลำดับชั้นใดก็ตามที่คุณชี้ไปที่เช่นเดียวกับสถิติเพิ่มเติมบางอย่าง

เรียงลำดับผลลัพธ์:

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


31
cloc.sourceforge.netอาจจะคุ้มค่าที่จะมองหาทางเลือกหนึ่งสำหรับ sloccount (ภาษาอื่น ๆ แต่มีข้อมูลน้อยลง)
AsTeR

31
รวมถึงไฟล์ด้วย:find . -name '*.php' -o -name '*.inc' | xargs wc -l
rymo

52
นี้จะพิมพ์มากกว่าหนึ่งหมายเลขเมื่อมีไฟล์จำนวนมาก (เพราะwcจะทำงานหลายครั้งนอกจากนี้ยังไม่ได้จัดการชื่อไฟล์พิเศษจำนวนมาก
l0b0

42
@idober:find . -name "*.php" -not -path "./tests*" | xargs wc -l
endre

19
หากชื่อไดเรกทอรีมีช่องว่างใด ๆ ... คำสั่งด้านบนล้มเหลว !!
nitish712

474

สำหรับอีกซับหนึ่ง:

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

ใช้งานได้กับชื่อที่มีช่องว่างส่งออกหนึ่งหมายเลขเท่านั้น


1
+1 เหมือนกัน ... ค้นหาตลอดไป ... คำสั่ง "ค้นหา" อื่น ๆ ทั้งหมดส่งคืน # ของไฟล์จริง .... -print0 เนื้อหาที่นี่มีจำนวนบรรทัดจริงสำหรับฉัน !!! ขอบคุณ!
Ronedog

3
@ TorbenGundtofte-Bruun - ดูman find.. print0 with xargs -0 ช่วยให้คุณทำงานกับไฟล์ที่มีช่องว่างหรือตัวละครแปลก ๆ ในชื่อของพวกเขา
Shizzmo

2
@ TorbenGundtofte-Bruun - เช่นกัน -0 ใน xargs สอดคล้องกับ print0 มันเป็นชนิดของการเข้ารหัส / ถอดรหัสเพื่อจัดการช่องว่าง
Tristan Reid

7
หากคุณต้องการตัวกรองชื่อมากกว่าหนึ่งฉันพบว่า (อย่างน้อยกับรุ่น MSYSGit ของการค้นหา) คุณต้องมี parens พิเศษ: ( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Zrax

1
@DesignbyAdrian: Journaling ช่วยในการกู้คืนความผิดพลาดไม่ใช่ความเร็ว ดูเหมือนว่าคุณจะเห็นประสิทธิภาพที่ดีเนื่องจากการแคชหรือ HDD ที่เร็วมาก
jmh

398

หากใช้ Bash (หรือ ZSH) เวอร์ชันล่าสุด decently มันง่ายกว่ามาก:

wc -l **/*.php

ในเชลล์ Bash ต้องมีglobstarตัวเลือกในการตั้งค่ามิฉะนั้น**ผู้ดำเนินการ glob จะไม่เรียกซ้ำ หากต้องการเปิดใช้งานการตั้งค่านี้ให้ออก

shopt -s globstar

ที่จะทำให้ถาวรนี้เพิ่มไปยังหนึ่งในไฟล์เริ่มต้น ( ~/.bashrc, ~/.bash_profileฯลฯ )


7
ฉัน upvoting นี้เพื่อความเรียบง่าย แต่ฉันต้องการชี้ให้เห็นว่ามันไม่ปรากฏขึ้นเพื่อค้นหาไดเรกทอรีซ้ำมันเพียงตรวจสอบไดเรกทอรีย่อยของไดเรกทอรีปัจจุบัน นี่คือ SL6.3
Godric Seer

7
ขึ้นอยู่กับเชลล์และตัวเลือกที่คุณตั้งไว้ ต้องglobstarมีการตั้งค่า Bash เพื่อให้สิ่งนี้ทำงาน
Michael Wild

2
@PeterSenna ที่มีเคอร์เนลไฟล์เก็บถาวร 3.9.8 ปัจจุบันคำสั่งwc -l **/*.[ch]ค้นหาทั้งหมด 15195373 บรรทัด ไม่แน่ใจว่าคุณคิดว่าเป็น "ค่าที่ต่ำมาก" หรือไม่ อีกครั้งคุณต้องตรวจสอบให้แน่ใจว่าคุณได้globstarเปิดใช้งานใน Bash แล้ว shopt globstarคุณสามารถตรวจสอบกับ shopt -s globstarเปิดใช้งานได้อย่างชัดเจนทำ
Michael Wild

5
@MichaelWild นี่เป็นทางออกที่ดี แต่จะยังล้นARG_MAXถ้าคุณมี.phpไฟล์จำนวนมากเนื่องจากwcไม่ได้อยู่ในตัว
Reinstate Monica ได้โปรด

1
@AlbertSamuel ไม่คุณต้องเปรียบเทียบรายการไฟล์ที่สร้างโดยทั้งสองวิธี วิธีการของฉันมีปัญหาการไม่ทำงานกับไฟล์จำนวนมากตามที่ระบุไว้โดย @BroSlow คำตอบที่ยอมรับจะล้มเหลวหากเส้นทางที่ผลิตโดยfindมีช่องว่าง ที่สามารถแก้ไขได้โดยใช้print0และ--nullกับfindและxargsโทรตามลำดับ
Michael Wild

363

คุณสามารถใช้clocยูทิลิตี้ที่สร้างขึ้นเพื่อวัตถุประสงค์ที่แน่นอนนี้ รายงานจำนวนบรรทัดในแต่ละภาษาพร้อมกับจำนวนความคิดเห็น ฯลฯ CLOC มีอยู่ใน Linux, Mac และ Windows

ตัวอย่างการใช้งานและเอาต์พุต:

$ 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
-------------------------------------------------------------------------------

4
นั่นเป็นเครื่องมือที่น่ารักที่ทำงานได้ดีและรวดเร็วให้สถิติที่เป็นประโยชน์ในตอนท้าย รักมัน
Rob Forrest

4
โปรดทราบว่าคุณสามารถเรียกใช้คำสั่ง Unix บน Windows โดยใช้ cygwin (หรือพอร์ต / สภาพแวดล้อมอื่นที่คล้ายคลึงกัน) สำหรับฉันแล้วการเข้าถึงแบบนี้มีประโยชน์อย่างมากมันเป็นสิ่งจำเป็น บรรทัดคำสั่ง unix นั้นวิเศษมาก ฉันชอบ Perl และการแสดงออกปกติโดยเฉพาะอย่างยิ่ง
Curtis Yallop

CLOC และ SLOCCount ทำงานได้ดีในช่วงกลางปี ​​2015 macbook โปรดสังเกตว่าตัวเลขของพวกเขาใกล้เคียงกัน แต่ไม่เหมือนกันสำหรับโครงการ Java Android 127k ยังทราบว่าเทียบเท่า iOS มี 2x LoC; ดังนั้นการวัด "ต้นทุน" ใน SLOCCount อาจถูกปิด (หรือ iOS อาจทำให้เป็น 2 เท่าที่อุปกรณ์ Android พัฒนาให้ :-)
maxweber

2
คุณจะพิจารณาแก้ไขจุดเริ่มต้นของคำถามนี้เพื่อให้ชัดเจนว่าclocเป็นแพลตฟอร์มข้ามเนื่องจากเป็นเพียงสคริปต์ Perl หรือไม่
Kyle Strand

สมบูรณ์แบบทำงานได้ดีใน Windows bash และแน่นอน
yurisnm

100

บนระบบที่เหมือน 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
-------------------------------------------------------------------------------

2
@moose เทคนิค simtao กล่าวถึงมันโดยเฉพาะว่าเป็นวิธีแก้ปัญหาสำหรับผู้ใช้ windows ไม่พูดถึง linux หรือ unix เลย
Tim Seguine

5
@moose Table ถูกแก้ไขเป็นคำตอบของเขาช้ากว่าคำตอบของฉันตอนนี้ทั้งสองดูเหมือนกันจริง ๆ
Calmarius

ฉันชอบมัน. cloc เรียบร้อยจริงๆ แต่ชื่อนั้นหมายความว่าอะไร?
Manoel Vilela

ตอนนี้มันอยู่บน Windows ด้วย! สมมติว่าคุณมีช็อกโกแลตแล้ว :choco install cloc
icc97

35

คุณไม่ได้ระบุจำนวนไฟล์ที่มีหรือผลลัพธ์ที่ต้องการ นี่คือสิ่งที่คุณกำลังมองหา:

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

2
วิธีนี้จะใช้งานได้ตราบใดที่มีไฟล์ไม่มากเกินไป: หากมีไฟล์จำนวนมากคุณจะได้รับหลายบรรทัดตามผล (xargs จะแบ่งรายชื่อไฟล์ในรายการย่อยหลายรายการ)
Pascal MARTIN

อ่าใช่ นั่นเป็นเหตุผลที่ฉันบอกว่าเขาไม่ได้ระบุจำนวนไฟล์ที่มี รุ่นของฉันจำง่ายกว่า แต่รุ่นของ Shin จะดีกว่าถ้าคุณมีไฟล์มากกว่าสองสามไฟล์ ฉันลงคะแนนมัน
Paweł Polewicz

ฉันต้องการที่จะปรับตัวสำหรับการใช้งานในฟังก์ชั่นที่ราคาเดียวมีข้อ จำกัด มากเกินไป: go () { mkdir /tmp/go; [[ -f ./"$1" ]] && mv ./"$1" /tmp/go; (find ./ -type f -name "$*" -print0 | xargs -0 cat ) | wc -l; wc -l /tmp/go/*; mv /tmp/go/* . } ผลได้ใกล้เคียงกับ slocount สำหรับ*.pyแต่มันก็ไม่ทราบ,*.js *.html
jananb

31

รูปแบบอื่น :)

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

แก้ไข: สิ่งนี้จะให้ผลรวมทั้งหมดแทนที่จะเป็นไฟล์ต่อไฟล์

แก้ไข 2: เพิ่ม.หลังจากfindเพื่อให้ทำงานได้


คำตอบทั้งคู่รวมบรรทัด
josh123a123

อย่างน้อยใน cygwin ฉันได้ผลลัพธ์ที่ดีกว่าด้วย:$ find -name \*\.php -print0 | xargs -0 cat | wc -l
Martin Haeberli

ในดาร์วินสิ่งนี้จะให้ผลรวมที่ยิ่งใหญ่: find . -name '*.php' | xargs cat | wc -l... ในขณะที่สิ่งนี้ให้ไฟล์แบบไฟล์ต่อไฟล์และผลรวมทั้งหมด:find . -name '*.php' | xargs wc -l
OsamaBinLogin

30

น่าแปลกที่ไม่มีคำตอบขึ้นอยู่กับการหาของและ-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; }'

2
ฟังก์ชั่นนี้ใช้งานได้ดี แต่ในรายชื่อขนาดใหญ่ (แหล่งลินุกซ์) มันช้ามากเพราะมันเริ่มต้นกระบวนการ wc สำหรับแต่ละไฟล์แทน 1 wc กระบวนการสำหรับไฟล์ทั้งหมด ฉันหมดเวลาไว้ที่ 31 วินาทีโดยใช้วิธีการนี้เมื่อเทียบกับ 1.5 find . -name '*.c' -print0 |xargs -0 wc -lวินาทีโดยใช้ ที่กล่าวไว้ว่าวิธีการที่เร็วกว่านี้ (อย่างน้อยใน OS X) สิ้นสุดการพิมพ์ "รวม" หลายครั้งดังนั้นต้องมีการกรองเพิ่มเติมเพื่อให้ได้ผลรวมที่เหมาะสม (ฉันโพสต์รายละเอียดในคำตอบของฉัน)
Doug Richardson

สิ่งนี้มีประโยชน์ในการทำงานกับไฟล์ไม่ จำกัด จำนวน ทำได้ดี!
ekscrypto

1
นี่เป็นทางออกที่ดีกว่าเมื่อทำงานกับ GB และไฟล์จำนวนมาก การดำเนินการอย่างใดอย่างหนึ่งwcในรูปแบบ a catนั้นช้าเพราะระบบจะต้องดำเนินการ GB ทั้งหมดเพื่อเริ่มนับบรรทัด (ทดสอบด้วย 200GB ของ jsons, ไฟล์ 12k) ทำwcก่อนแล้วจึงนับผลลัพธ์ได้เร็วขึ้นกว่าเดิม
ulkas

1
@DougRichardson คุณสามารถพิจารณาสิ่งนี้แทน: find . -type f -exec wc -l {} \+หรือ find . -name '*.py' -type f -exec wc -l {} \+ พิมพ์ผลรวมในตอนท้ายของผลลัพธ์ หากสิ่งที่คุณสนใจคือผลรวมแล้วคุณสามารถไปต่อและใช้tail: find . -type f -exec wc -l {} \+ | tail -1หรือfind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
JamieJag

25

พบได้ทั่วไปและเรียบง่ายสำหรับฉันสมมติว่าคุณต้องนับไฟล์ที่มีนามสกุลแตกต่างกัน (เช่นคนพื้นเมืองด้วย)

wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )

ขอบคุณสำหรับคำติชมฉันได้ทำการแก้ไขแล้ว


6
สิ่งนี้ไม่ได้ทำในสิ่งที่คุณคิด หา -name ' . [am]' เหมือนกันกับการค้นหา -name ' . [a | m]' ทั้งคู่จะพบไฟล์ทั้งหมดที่ลงท้ายด้วย. m หรือ. a
Omry Yadan

1
แต่ไฟล์ที่สองจะค้นหาไฟล์ที่ลงท้ายด้วย | , ถ้ามี. ดังนั้น [h | c | cpp | php | cc] จึงกลายเป็นเช่นเดียวกับ [hcp |]
OsamaBinLogin

backticks เลิกใช้งานแล้วชอบ$()
Sandburg

งานนี้ภายใต้ Cygwin แน่นอนไดรฟ์ "C: \" ต้องปฏิบัติตามระเบียบ cygwin เช่นเช่น: wc $ (find / cygdrive / c // SomeWindowsFolderj / -type f | egrep "\. (h | c | cpp | php | php | cc) ")
Christian Gingras

21

POSIX

ต่างจากคำตอบอื่น ๆ ส่วนใหญ่ที่นี่การทำงานเหล่านี้กับระบบ POSIX สำหรับไฟล์จำนวนเท่าใดก็ได้และชื่อไฟล์ใด ๆ (ยกเว้นที่ระบุไว้)


บรรทัดในแต่ละไฟล์:

find . -name '*.php' -type f -exec wc -l {} \;
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} +

บรรทัดในแต่ละไฟล์เรียงตามเส้นทางไฟล์

find . -name '*.php' -type f | sort | xargs -L1 wc -l
# for files with spaces or newlines, use the non-standard sort -z
find . -name '*.php' -type f -print0 | sort -z | xargs -0 -L1 wc -l

เส้นในแต่ละไฟล์เรียงตามจำนวนบรรทัดจากมากไปน้อย

find . -name '*.php' -type f -exec wc -l {} \; | sort -nr
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} + | sort -nr

จำนวนบรรทัดทั้งหมดในไฟล์ทั้งหมด

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

19

มีเครื่องมือเล็กน้อยที่เรียกว่าsloccountเพื่อนับบรรทัดของรหัสในไดเรกทอรี ควรสังเกตว่ามันทำมากกว่าที่คุณต้องการเพราะมันไม่สนใจบรรทัด / ความคิดเห็นที่ว่างจัดกลุ่มผลลัพธ์ต่อภาษาการเขียนโปรแกรมและคำนวณสถิติบางอย่าง


สำหรับ windows LocMetricsทำงานได้
Camille

15

สิ่งที่คุณต้องการคือการforวนรอบที่เรียบง่าย:

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

3
ไม่เกินขนาดนี้เมื่อเปรียบเทียบกับคำตอบที่แนะนำxargsหรือไม่
นาธาน Fellman

5
ไม่นาธาน คำตอบ xargs ไม่จำเป็นต้องพิมพ์นับเป็นตัวเลขเดียว มันอาจจะพิมพ์ผลรวมย่อย
Rob Kennedy

3
โปรแกรมนี้จะทำอะไรถ้าชื่อไฟล์มีช่องว่าง สิ่งที่เกี่ยวกับการขึ้นบรรทัดใหม่? ;-)
Paweł Polewicz

38
หากชื่อไฟล์ของคุณมีบรรทัดใหม่ฉันจะบอกว่าคุณมีปัญหาใหญ่กว่า
Kzqai

2
@ennuikiller จำนวนของปัญหาเกี่ยวกับสิ่งนี้สิ่งแรกเลยที่มันจะแตกไฟล์ด้วยช่องว่าง การตั้งค่าIFS=$'\n'ก่อนที่ลูปจะแก้ไขอย่างน้อยที่สุดสำหรับทุกคนยกเว้นไฟล์ที่มีบรรทัดใหม่ในชื่อ ประการที่สองคุณไม่ได้อ้างถึง'*.php'ดังนั้นมันจะขยายโดยเชลล์และไม่ใช่findและเออร์โกจะไม่พบไฟล์ php ใด ๆ ในไดเรกทอรีย่อย นอกจากนี้ยัง-printมีซ้ำซ้อนเนื่องจากมันส่อให้เห็นในกรณีที่ไม่มีการกระทำอื่น ๆ
Reinstate Monica โปรด


11

ตรงไปตรงมาที่จะเร็วจะใช้พลังการค้นหา / การกรองทั้งหมดของfindไม่ล้มเหลวเมื่อมีไฟล์มากเกินไป (จำนวนอาร์กิวเมนต์ล้น) ทำงานได้ดีกับไฟล์ที่มีสัญลักษณ์ตลกในชื่อของพวกเขาโดยไม่ใช้xargsจะไม่เปิดตัว คำสั่งภายนอกจำนวนสูงอย่างไร้ประโยชน์ (ขอบคุณ+สำหรับfind's -exec) ไปเลย:

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

2
ฉันกำลังจะโพสต์ชุดตัวเองนี้ ( \;แทนที่จะ+เป็นเพราะฉันไม่รู้) คำตอบนี้ควรเป็นคำตอบที่ถูกต้อง
Mark K Cowan

7

ฉันรู้ว่าคำถามถูกติดแท็กเป็น แต่ดูเหมือนว่าปัญหาที่คุณพยายามแก้ไขนั้นเกี่ยวข้องกับ PHP เช่นกัน

Sebastian Bergmann เขียนเครื่องมือที่เรียกว่าPHPLOCซึ่งทำสิ่งที่คุณต้องการและเหนือสิ่งอื่นใดซึ่งจะให้ภาพรวมของความซับซ้อนของโครงการ นี่คือตัวอย่างของรายงาน:

Size
  Lines of Code (LOC)                            29047
  Comment Lines of Code (CLOC)                   14022 (48.27%)
  Non-Comment Lines of Code (NCLOC)              15025 (51.73%)
  Logical Lines of Code (LLOC)                    3484 (11.99%)
    Classes                                       3314 (95.12%)
      Average Class Length                          29
      Average Method Length                          4
    Functions                                      153 (4.39%)
      Average Function Length                        1
    Not in classes or functions                     17 (0.49%)

Complexity
  Cyclomatic Complexity / LLOC                    0.51
  Cyclomatic Complexity / Number of Methods       3.37

อย่างที่คุณเห็นข้อมูลที่ให้ไว้มีประโยชน์มากขึ้นจากมุมมองของนักพัฒนาเนื่องจากสามารถบอกคุณได้อย่างคร่าว ๆ ว่าโครงการมีความซับซ้อนเพียงใดก่อนที่คุณจะเริ่มทำงานกับมัน


7

การคาดเดาว่าไม่มีใครเคยเห็นสิ่งนี้ฝังอยู่ที่ด้านหลัง ... แต่ยังไม่มีคำตอบใด ๆ ที่ทำให้เกิดปัญหากับชื่อไฟล์ที่มีช่องว่าง นอกจากนี้การใช้งานทั้งหมดนั้นxargsอาจล้มเหลวหากความยาวทั้งหมดของพา ธ ในทรีเกินขนาด จำกัด ของสภาพแวดล้อมของเชลล์ (ค่าเริ่มต้นคือไม่กี่เมกะไบต์ใน Linux) นี่คือปัญหาที่แก้ไขปัญหาเหล่านี้อย่างตรงไปตรงมา เชลล์ย่อยดูแลไฟล์ที่มีช่องว่าง จำนวนawkรวมของwcเอาต์พุตไฟล์แต่ละไฟล์ดังนั้นจึงไม่ควรใช้พื้นที่ นอกจากนี้ยัง จำกัดexecไฟล์ไว้ที่เท่านั้น (การข้ามไดเรกทอรี):

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

6

ห้องสุขา -L? ควรใช้ GREP -C ^

สุขา -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 (นับเข้าไม่ใช่บรรทัด !!!)


โปรดอ่านคำนิยาม POSIX ของเส้น เมื่อgrep -c ^คุณนับจำนวนบรรทัดที่ไม่สมบูรณ์และบรรทัดที่ไม่สมบูรณ์นั้นไม่สามารถปรากฏในไฟล์ข้อความได้
gniourf_gniourf

2
ฉันรู้แล้ว ในทางปฏิบัติบรรทัดสุดท้ายเท่านั้นอาจไม่สมบูรณ์เพราะไม่มี EOL แนวคิดกำลังนับทุกบรรทัดรวมถึงที่ไม่สมบูรณ์ มันเป็นความผิดพลาดที่เกิดขึ้นบ่อยมากนับเฉพาะเส้นที่สมบูรณ์เท่านั้น หลังจากนับเรากำลังคิดว่า "ทำไมฉันถึงพลาดบรรทัดสุดท้าย ???" นี่คือคำตอบว่าทำไมและสูตรวิธีการทำอย่างถูกต้อง
Znik

หรือถ้าคุณต้องการหนึ่งซับ: find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc ดูที่นี่สำหรับทางเลือกไปที่bc: stackoverflow.com/q/926069/2400328
techniao

5

มันง่ายมากกับ zsh globs:

wc -l ./**/*.php

หากคุณกำลังใช้ bash คุณเพียงแค่ต้องอัปเกรด ไม่มีเหตุผลใดที่จะใช้ bash


4

ง่ายมาก

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

1
มันจะล้มเหลวหากมีช่องว่างหรือบรรทัดใหม่ในหนึ่งในชื่อไฟล์
Paweł Polewicz

4

หากคุณต้องการให้ผลลัพธ์เรียงตามจำนวนบรรทัดคุณสามารถเพิ่ม| sortหรือ| sort -r( -rสำหรับลำดับจากมากไปหาน้อย) ในคำตอบแรกเช่น:

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

1
เนื่องจากการส่งออกของxargs wc -lเป็นตัวเลขจริงจะต้องใช้หรือsort -n sort -nr
ดัสตินอินแกรม

4

สำหรับของ Windows , เครื่องมือที่ง่ายและรวดเร็วเป็นLocMetrics


มันไม่น่าเป็นไปได้ที่ OP จะใช้บน Windows หากพวกเขากำลังใช้ bash

1
@VanessaMcHale ชื่อคำถามและคำอธิบายทั้งคู่ไม่จำเป็นต้องใช้วิธีแก้ปัญหาอย่างชัดเจนเท่านั้น ดังนั้นโซลูชันที่ใช้ Windows จึงเป็นที่ยอมรับ Google ยังชี้ให้ฉันไปที่หน้านี้เมื่อฉันกำลังมองหาวิธีการแก้ปัญหาที่คล้ายกัน
walv

ความคิดเห็นนี้ช่วยฉัน ฉันลองมันและมันใช้งานได้ดี
อัลลัน F

4

บางอย่างที่แตกต่าง:

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

นี้ทำงานออกมาดี แต่คุณจะต้องมีอย่างน้อยหนึ่ง*.phpไฟล์ในโฟลเดอร์ปัจจุบันหรือหนึ่งในโฟลเดอร์ย่อยหรืออื่น ๆ ที่wcคอกม้า


อาจล้น ARG_MAX
Mark K Cowan

4

หากคุณอยู่ในลินุกซ์ (และฉันจะเอามันที่คุณอยู่) ผมขอแนะนำเครื่องมือของฉันพูดได้หลายภาษา มันเป็นอย่างมากเร็วกว่าอย่างใดอย่างหนึ่งsloccountหรือclocและมันก็เป็น featureful sloccountมากกว่า

คุณสามารถเรียกใช้ด้วย

poly .

หรือ

poly

ดังนั้นมันจึงเป็นมิตรกับผู้ใช้มากกว่าสคริปต์ bash ที่ซับซ้อน


4

เครื่องมือTokeiแสดงสถิติเกี่ยวกับรหัสในไดเรกทอรี Tokei จะแสดงจำนวนไฟล์บรรทัดทั้งหมดภายในไฟล์และรหัสความคิดเห็นและช่องว่างจัดกลุ่มตามภาษา Tokei มีให้ใน Mac, Linux และ Windows

ตัวอย่างของผลลัพธ์ของ Tokei มีดังนี้:

$ tokei
-------------------------------------------------------------------------------
 Language            Files        Lines         Code     Comments       Blanks
-------------------------------------------------------------------------------
 CSS                     2           12           12            0            0
 JavaScript              1          435          404            0           31
 JSON                    3          178          178            0            0
 Markdown                1            9            9            0            0
 Rust                   10          408          259           84           65
 TOML                    3           69           41           17           11
 YAML                    1           30           25            0            5
-------------------------------------------------------------------------------
 Total                  21         1141          928          101          112
-------------------------------------------------------------------------------

Tokei สามารถติดตั้งได้โดยทำตามคำแนะนำบนไฟล์ README ในพื้นที่เก็บข้อมูล


1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Elijas

3

หากคุณต้องการเพียงจำนวนบรรทัดทั้งหมดในไฟล์ PHP ของคุณคุณสามารถใช้คำสั่งหนึ่งบรรทัดได้ง่ายแม้ใน Windows หากคุณติดตั้ง GnuWin32 แบบนี้:

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

คุณต้องระบุตำแหน่งที่ตรงกับ find.exe มิฉะนั้น Windows ที่มีให้ FIND.EXE (จากคำสั่งเหมือน DOS) จะถูกดำเนินการเนื่องจากอาจเป็นก่อน GnuWin32 ใน PATH สิ่งแวดล้อมและมีพารามิเตอร์และผลลัพธ์ที่แตกต่างกัน

โปรดทราบว่าในคำสั่งด้านบนคุณควรใช้เครื่องหมายคำพูดด้านหลังไม่ใช่เครื่องหมายคำพูดเดี่ยว


ในตัวอย่างข้างต้นฉันใช้ bash สำหรับ windows แทน cmd.exe นั่นคือสาเหตุที่มีเครื่องหมายทับซ้าย "/" และไม่ใช่เครื่องหมายแบ็คสแลช "\"
Neven Boyanov

3

การให้ไฟล์ที่ยาวที่สุดก่อน (เช่นไฟล์ที่ยาวเหล่านี้จำเป็นต้องมีการรีแฟคเตอริ่งใหม่อีกครั้ง?) และไม่รวมไดเรกทอรีผู้จำหน่ายบางรายการ:

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

3

หากคุณต้องการให้มันง่าย ๆ ให้ตัดคนกลางออกและเรียกwcชื่อไฟล์ทั้งหมด:

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

หรือในรูปแบบที่ทันสมัย:

wc -l $(find . -name "*.php")

ทำงานได้ตราบใดที่ไม่มีช่องว่างในชื่อไดเรกทอรีหรือชื่อไฟล์ และตราบใดที่คุณไม่มีไฟล์นับหมื่น (เชลล์สมัยใหม่สนับสนุนบรรทัดคำสั่งที่ยาวมาก ๆ ) โครงการของคุณมีไฟล์ 74 ไฟล์ดังนั้นคุณมีพื้นที่เหลือเฟือที่จะเติบโต


ฉันชอบอันนี้! หากคุณอยู่ในสภาพแวดล้อม C / C ++ ไฮบริด:wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
Bram

รู้สึกประหลาดใจที่ไม่ใช่คำตอบที่ดีที่สุด
ms4720

3

คุณไม่ต้องการคำสั่งที่ซับซ้อนและจำยากเหล่านี้ทั้งหมด คุณเพียงแค่ต้องใช้เครื่องมือที่เรียกว่าเส้นที่เคาน์เตอร์

ภาพรวมอย่างรวดเร็ว

นี่คือวิธีที่คุณได้รับเครื่องมือ

$ pip install line-counter

ใช้lineคำสั่งเพื่อรับจำนวนไฟล์และจำนวนบรรทัดภายใต้ไดเรกทอรีปัจจุบัน (เรียกซ้ำ)

$ line
Search in /Users/Morgan/Documents/Example/
file count: 4
line count: 839

line -dหากคุณต้องการรายละเอียดเพิ่มเติมการใช้งานเพียงแค่

$ line -d
Search in /Users/Morgan/Documents/Example/
Dir A/file C.c                                             72
Dir A/file D.py                                           268
file A.py                                                 467
file B.c                                                   32
file count: 4
line count: 839

และส่วนที่ดีที่สุดของเครื่องมือนี้คือคุณสามารถเพิ่ม .gitignoreเช่นกำหนดค่าไฟล์ลงไป คุณสามารถตั้งค่ากฎเพื่อเลือกหรือละเว้นไฟล์ที่จะนับเช่นเดียวกับที่คุณทำใน '.gitignore'

คำอธิบายเพิ่มเติมและการใช้งานอยู่ที่นี่: https://github.com/MorganZhang100/line-counter


3

หากไฟล์มีจำนวนมากเกินไปควรหาจำนวนบรรทัดทั้งหมด

find . -name '*.php' | xargs wc -l | grep -i ' total' | awk '{print $1}'

2

อย่างน้อยใน OS X คำสั่ง find + xarg + wc ที่แสดงรายการอยู่ในคำตอบอื่น ๆ จะพิมพ์คำว่า "รวม" หลายครั้งในรายการขนาดใหญ่และไม่มีการระบุทั้งหมด ฉันสามารถรับผลรวมทั้งหมดสำหรับไฟล์. c โดยใช้คำสั่งต่อไปนี้:

find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.