Làm thế nào để đếm tất cả các dòng mã trong một thư mục đệ quy?


1624

Chúng tôi đã có một ứng dụng PHP và muốn đếm tất cả các dòng mã trong một thư mục cụ thể và các thư mục con của nó. Chúng ta không cần phải bỏ qua các bình luận, vì chúng ta chỉ đang cố gắng để có được một ý tưởng sơ bộ.

wc -l *.php 

Lệnh đó hoạt động rất tốt trong một thư mục nhất định, nhưng bỏ qua các thư mục con. Tôi đã nghĩ rằng điều này có thể làm việc, nhưng nó đã trở lại 74, đó chắc chắn không phải là trường hợp ...

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

Cú pháp đúng để cung cấp trong tất cả các tệp là gì?

Câu trả lời:


2650

Thử:

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

Công cụ SLOCCount cũng có thể giúp đỡ.

Nó sẽ đưa ra một dòng mã chính xác về số lượng mã cho bất kỳ thứ bậc nào bạn chỉ ra, cũng như một số thống kê bổ sung.

Đầu ra được sắp xếp:

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


31
cloc.sourceforge.net có thể đáng xem như là một thay thế cho sloccount (nhiều ngôn ngữ hơn nhưng ít thông tin hơn)
AsTeR

31
cũng bao gồm các tệp:find . -name '*.php' -o -name '*.inc' | xargs wc -l
rymo

52
Điều này sẽ in nhiều hơn một số khi có nhiều tệp (vì wcsẽ được chạy nhiều lần. Ngoài ra, không xử lý nhiều tên tệp đặc biệt.
l0b0

42
@idober:find . -name "*.php" -not -path "./tests*" | xargs wc -l
thúc vào

19
Nếu tên thư mục chứa bất kỳ khoảng trắng nào ... lệnh trên sẽ thất bại !!
nitish712

474

Đối với một lớp lót khác:

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

hoạt động trên tên có khoảng trắng, chỉ xuất ra một số.


1
+1 ditto ... đã tìm kiếm mãi mãi ... tất cả các lệnh "tìm" khác chỉ trả về # của các tệp thực tế .... công cụ -print0 ở đây có số lượng dòng thực tế cho tôi !!! cảm ơn!
Ronedog

3
@ TorbenGundtofte-Bruun - xem man find.. print0 với xargs -0 cho phép bạn hoạt động trên các tệp có khoảng trắng hoặc các ký tự lạ khác trong tên của chúng
Shizzmo

2
@ TorbenGundtofte-Bruun - đồng thời, -0 trong xargs tương ứng với print0, đây là loại mã hóa / giải mã để xử lý các khoảng trắng.
Tristan Reid

7
Nếu bạn cần nhiều hơn một bộ lọc tên, tôi đã tìm thấy điều đó (ít nhất là với phiên bản tìm kiếm MSYSGit), bạn cần có thêm các phép tính: ( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Zrax

1
@DesignbyAdrian: Ghi nhật ký giúp phục hồi sự cố, không phải tốc độ. Có khả năng bạn đang thấy hiệu suất tốt do bộ nhớ đệm hoặc ổ cứng rất nhanh.
jmh

398

Nếu sử dụng một phiên bản gần đây của Bash (hoặc ZSH), thì đơn giản hơn nhiều:

wc -l **/*.php

Trong shell Bash, điều này đòi hỏi phải đặt globstartùy chọn, nếu không thì **toán tử toàn cục không được đệ quy. Để bật cài đặt này, hãy phát hành

shopt -s globstar

Để làm điều này vĩnh viễn, hãy thêm nó vào một trong các tệp khởi tạo ( ~/.bashrc, ~/.bash_profilev.v.).


7
Tôi đang nâng cao điều này cho đơn giản, tuy nhiên tôi chỉ muốn chỉ ra rằng nó không xuất hiện để tìm kiếm các thư mục theo cách đệ quy, nó chỉ kiểm tra các thư mục con của thư mục hiện tại. Đây là trên SL6.3.
Godric Seer

7
Điều đó phụ thuộc vào vỏ của bạn và các tùy chọn bạn đã đặt. Bash yêu cầu globstarphải được thiết lập để làm việc này.
Michael Wild

2
@PeterSenna, với kho lưu trữ kernel 3.9.8 hiện tại, lệnh wc -l **/*.[ch]tìm thấy tổng cộng 15195373 dòng. Không chắc chắn liệu bạn có coi đó là "giá trị rất thấp" hay không. Một lần nữa, bạn cần đảm bảo rằng bạn đã globstarkích hoạt trong Bash. Bạn có thể kiểm tra với shopt globstar. Để kích hoạt nó một cách rõ ràng, hãy làm shopt -s globstar.
Michael Wild

5
@MichaelWild Đây là một giải pháp tốt, nhưng nó vẫn sẽ tràn ARG_MAXnếu bạn có số lượng .phptệp lớn, vì wckhông được tích hợp sẵn.
Phục hồi Monica Vui lòng

1
@AlbertSamuel Không, bạn cần so sánh danh sách các tệp được tạo bởi cả hai phương pháp. Phương pháp của tôi có vấn đề không hoạt động đối với số lượng lớn tệp, như được đề cập bởi @BroSlow. Câu trả lời được chấp nhận sẽ thất bại nếu các đường dẫn được tạo bởi findchứa khoảng trắng. Điều đó có thể được khắc phục bằng cách sử dụng print0--nullvới các cuộc gọi findxargstương ứng.
Michael Wild

363

Bạn có thể sử dụng cloctiện ích được xây dựng cho mục đích chính xác này. Nó báo cáo từng lượng dòng trong mỗi ngôn ngữ, cùng với bao nhiêu trong số đó là nhận xét, v.v. CLOC có sẵn trên Linux, Mac và Windows.

Ví dụ sử dụng và đầu ra:

$ 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
Đó là một công cụ đáng yêu chạy tốt và nhanh chóng đưa ra các số liệu thống kê hữu ích vào cuối. Yêu nó.
Rob Forrest

4
Lưu ý rằng bạn có thể chạy các lệnh Unix trên Windows bằng cygwin (hoặc các cổng / môi trường tương tự khác). Đối với tôi, có loại truy cập này cực kỳ hữu ích, đó là một điều cần thiết. Một dòng lệnh unix là huyền diệu. Tôi đặc biệt thích perl và biểu thức thông thường.
Curtis Yallop

CLOC và SLOCCount hoạt động tốt trên macbook giữa năm 2015. Lưu ý số lượng của chúng gần nhưng không hoàn toàn giống nhau cho dự án Java Android 127k. Cũng lưu ý rằng tương đương iOS có gấp đôi LoC; vì vậy, số liệu "chi phí" trong SLOCCount có thể bị tắt (hoặc có thể nhà phát triển iOS kiếm được gấp đôi số tiền mà nhà phát triển Android tạo ra :-)
maxweber

2
Bạn có xem xét việc chỉnh sửa phần đầu của câu hỏi này để làm rõ rằng đó cloclà nền tảng chéo vì nó chỉ là một tập lệnh Perl?
Kyle Strand

Tất nhiên, hoàn hảo, cũng hoạt động tốt trong Windows bash.
yurisnm

100

Trên các hệ thống giống như UNIX, có một công cụ được gọi là cloccung cấp số liệu thống kê mã.

Tôi chạy vào một thư mục ngẫu nhiên trong cơ sở mã của chúng tôi, nó nói:

      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 về mặt kỹ thuật simtao đã đề cập đến nó một cách cụ thể như một giải pháp cho người dùng windows, không đề cập đến linux hay unix nào cả.
Tim Seguine

5
@moose Bảng đã được chỉnh sửa thành câu trả lời của anh ấy muộn hơn câu trả lời của tôi, bây giờ cả hai thực sự trông giống nhau.
Calmarius

Tôi thích nó. cloc thực sự gọn gàng. Nhưng cái tên đó có nghĩa là gì?
Manoel Vilela

Bây giờ cũng có trên Windows! Giả sử bạn đã có sô cô la :choco install cloc
icc97

35

Bạn đã không chỉ định có bao nhiêu tệp ở đó hoặc đầu ra mong muốn là gì. Đây có phải là những gì bạn đang tìm kiếm:

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

2
Điều này sẽ hoạt động, miễn là không có quá nhiều tệp: nếu có nhiều tệp, kết quả là bạn sẽ nhận được một số dòng (xargs sẽ chia danh sách tệp trong một số danh sách phụ)
Pascal MARTIN

à, vâng Đó là lý do tại sao tôi nói Ông không chỉ định có bao nhiêu tập tin. Phiên bản của tôi dễ nhớ hơn, nhưng phiên bản của Shin sẽ tốt hơn nếu Bạn có nhiều hơn một vài tệp. Tôi đang bỏ phiếu cho nó.
Paweł Polewicz

Tôi cần phải điều chỉnh điều này để sử dụng trong một chức năng, trong đó các trích dẫn đơn quá hạn chế: Các 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/* . } kết quả gần với slocount cho *.py, nhưng nó không biết *.js, *.html.
jalanb

31

Một biến thể khác :)

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

Chỉnh sửa: điều này sẽ đưa ra tổng số, thay vì từng tập tin.

Edit2: Thêm .sau findđể làm cho nó hoạt động


cả hai câu trả lời tổng hợp các dòng.
josh123a123

Ít nhất là trong Cygwin, tôi đã có kết quả tốt hơn với:$ find -name \*\.php -print0 | xargs -0 cat | wc -l
Martin Haeberli

trên Darwin, điều này chỉ mang lại tổng cộng lớn: find . -name '*.php' | xargs cat | wc -l... trong khi điều này mang lại từng tập tin và tổng số lớn:find . -name '*.php' | xargs wc -l
OsamaBinLogin

30

Đáng ngạc nhiên là không có câu trả lời dựa trên tìm -execawk. Ở đây chúng tôi đi:

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

Đoạn mã này tìm thấy cho tất cả các tệp ( -type f). Để tìm bằng phần mở rộng tập tin, sử dụng -name:

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

2
Về mặt chức năng, điều này hoạt động hoàn hảo, nhưng trên danh sách lớn (nguồn linux) thì rất chậm vì nó bắt đầu quá trình wc cho mỗi tệp thay vì quy trình 1 wc cho tất cả các tệp. Tôi đã hẹn giờ ở mức 31 giây bằng phương pháp này so với 1,5 giây sử dụng find . -name '*.c' -print0 |xargs -0 wc -l. Điều đó nói rằng, phương pháp nhanh hơn này (ít nhất là trên OS X), kết thúc việc in "tổng số" nhiều lần để có một số bộ lọc bổ sung được yêu cầu để có được tổng số thích hợp (tôi đã đăng chi tiết trong câu trả lời của mình).
Doug Richardson

Điều này có lợi ích làm việc cho số lượng tệp không giới hạn. Làm tốt!
ekscrypto

1
đây là giải pháp tốt hơn nhiều khi làm việc với số lượng lớn GB và tệp. thực hiện một wctrên một dạng a catlà chậm vì trước tiên hệ thống phải xử lý tất cả GB để bắt đầu đếm các dòng (được thử nghiệm với 200 GB jsons, 12k tệp). làm wcđầu tiên sau đó đếm kết quả nhanh hơn nhiều
ulkas

1
@DougRichardson, bạn có thể xem xét điều này thay vào đó: find . -type f -exec wc -l {} \+hoặc find . -name '*.py' -type f -exec wc -l {} \+ in tổng số ở cuối đầu ra. Nếu tất cả những gì bạn quan tâm là tổng số, thì bạn có thể đi xa hơn một chút và sử dụng tail: find . -type f -exec wc -l {} \+ | tail -1hoặcfind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
JamieJag 20/03/19

25

Phổ biến và đơn giản hơn đối với tôi, giả sử bạn cần đếm các tệp của các phần mở rộng tên khác nhau (giả sử, cũng là người bản địa)

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

Cảm ơn bạn đã phản hồi, tôi đã sửa nó.


6
điều này không làm đúng như những gì bạn nghĩ tìm thấy . -name ' . [am]' giống hệt để tìm. -name ' . [a | m]' cả hai sẽ tìm thấy tất cả các tệp kết thúc bằng .m hoặc .a
Omry Yadan

1
nhưng thứ hai cũng sẽ tìm thấy các tập tin kết thúc bằng. | , nếu có. Vì vậy, [h | c | cpp | php | cc] cuối cùng giống như [hcp |].
OsamaBinLogin

backticks không được chấp nhận, ưu tiên$()
Sandburg

Điều này hoạt động theo Cygwin. Tất nhiên, ổ đĩa "C: \" phải tuân theo quy ước cygwin, ví dụ như: wc $ (find / cygdrive / c // someWindowsFolderj / -type f | egrep "\. (H | c | cpp | php | cc) ")
Christian Gingras

21

POSIX

Không giống như hầu hết các câu trả lời khác ở đây, những câu trả lời này hoạt động trên bất kỳ hệ thống POSIX nào, cho bất kỳ số lượng tệp nào và với bất kỳ tên tệp nào (trừ khi được ghi chú).


Các dòng trong mỗi tệp:

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 {} +

Các dòng trong mỗi tệp, được sắp xếp theo đường dẫn tệp

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

Các dòng trong mỗi tệp, được sắp xếp theo số dòng, giảm dần

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

Tổng số dòng trong tất cả các tệp

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

19

Có một công cụ nhỏ gọi là sloccount để đếm các dòng mã trong thư mục. Cần lưu ý rằng nó làm nhiều hơn bạn muốn vì nó bỏ qua các dòng / nhận xét trống, nhóm các kết quả cho mỗi ngôn ngữ lập trình và tính toán một số thống kê.


Đối với các cửa sổ, LocMetrics thực hiện công việc
Camille

15

Những gì bạn muốn là một forvòng lặp đơn giản :

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

3
không phải là quá mức cần thiết so với câu trả lời gợi ý xargs?
Nathan Fellman

5
Không, Nathan. Các câu trả lời xargs sẽ không nhất thiết phải in số đếm thành một số duy nhất. Nó có thể chỉ in một loạt các tổng số.
Rob Kennedy

3
Chương trình này sẽ làm gì nếu tên tệp chứa dấu cách? Những gì về dòng mới? ;-)
Paweł Polewicz

38
Nếu tên tệp của bạn chứa các dòng mới, tôi muốn nói rằng bạn có vấn đề lớn hơn.
Kzqai

2
@ennuikiller Số lượng các vấn đề với điều này, trước hết nó sẽ phá vỡ các tệp có khoảng trắng. Đặt IFS=$'\n'trước vòng lặp ít nhất sẽ sửa nó cho tất cả trừ các tệp có dòng mới trong tên của chúng. Thứ hai, bạn không trích dẫn '*.php', vì vậy nó sẽ được mở rộng bằng shell và không find, và ergo sẽ không thực sự tìm thấy bất kỳ tệp php nào trong các thư mục con. Ngoài ra, -printlà dư thừa, vì nó ngụ ý trong trường hợp không có hành động khác.
Phục hồi Monica Vui lòng

12

chỉ cho các nguồn:

wc `find`

để lọc, chỉ cần sử dụng grep

wc `find | grep .php$`

11

Một cách đơn giản sẽ nhanh, sẽ sử dụng tất cả sức mạnh tìm kiếm / lọc của find, không bị lỗi khi có quá nhiều tệp (đối số số tràn), hoạt động tốt với các tệp có ký hiệu vui trong tên của chúng, mà không sử dụng xargs, sẽ không khởi chạy số vô ích cao các lệnh bên ngoài (nhờ +cho find's -exec). Ở đây bạn đi:

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

2
Tôi đã định đăng một biến thể của cái này ( \;thay vì +tôi không biết về nó), câu trả lời này phải là câu trả lời đúng.
Mark K Cowan

7

Tôi biết câu hỏi được gắn thẻ là , nhưng có vẻ như vấn đề bạn đang cố gắng giải quyết cũng liên quan đến PHP.

Sebastian Bergmann đã viết một công cụ có tên PHPLOC thực hiện những gì bạn muốn và trên hết cung cấp cho bạn cái nhìn tổng quan về sự phức tạp của dự án. Đây là một ví dụ về báo cáo của nó:

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

Như bạn có thể thấy, thông tin được cung cấp hữu ích hơn rất nhiều từ góc độ của một nhà phát triển, bởi vì nó có thể cho bạn biết mức độ phức tạp của một dự án trước khi bạn bắt đầu làm việc với nó.


7

Đoán rằng sẽ không có ai nhìn thấy điều này bị chôn vùi ở phía sau ... Tuy nhiên, không có câu trả lời nào cho đến nay về vấn đề tên tập tin với không gian. Ngoài ra, tất cả những gì sử dụng xargsđều có thể thất bại nếu tổng chiều dài của các đường dẫn trong cây vượt quá giới hạn kích thước môi trường vỏ (mặc định là một vài megabyte trong Linux). Đây là một trong những sửa chữa những vấn đề này một cách khá trực tiếp. Subshell chăm sóc các tập tin với không gian. Tổng awksố luồng của các wcđầu ra tệp riêng lẻ , vì vậy không bao giờ hết dung lượng. Nó cũng hạn chế execchỉ các tệp (bỏ qua thư mục):

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

6

WC -L? sử dụng tốt hơn GREP -C ^

wc -l? Sai lầm! Lệnh wc đếm mã dòng mới, không phải dòng! Khi dòng cuối cùng trong tệp không kết thúc bằng mã dòng mới, điều này sẽ không được tính!

nếu bạn vẫn muốn các dòng đếm, hãy sử dụng grep -c ^ , ví dụ đầy đủ:

#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

cuối cùng, coi chừng bẫy wc -l (đếm vào, không phải dòng !!!)


Vui lòng đọc định nghĩa POSIX của một dòng . Với việc grep -c ^bạn đang đếm số lượng dòng không hoàn chỉnh và những dòng không hoàn chỉnh như vậy có thể xuất hiện trong một tệp văn bản .
gniourf_gniourf

2
Tôi biết điều đó Trong thực tế, chỉ dòng cuối cùng có thể không đầy đủ vì nó không có EOL. Ý tưởng là đếm tất cả các dòng bao gồm một không đầy đủ. Đó là lỗi rất thường xuyên, chỉ tính các dòng hoàn chỉnh. sau khi đếm, chúng tôi đang nghĩ "tại sao tôi lại bỏ lỡ dòng cuối ???". Đây là câu trả lời tại sao, và công thức làm thế nào để làm điều đó đúng.
Znik

Hoặc, nếu bạn muốn có một lớp lót: find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc Xem tại đây để biết các lựa chọn thay thế cho bc: stackoverflow.com/q/926069/2400328
techniao

4

rất đơn giản

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

1
nó sẽ thất bại nếu có một khoảng
trắng

4

Nếu bạn muốn kết quả của mình được sắp xếp theo số dòng, bạn chỉ cần thêm | sorthoặc | sort -r( -rtheo thứ tự giảm dần) vào câu trả lời đầu tiên, như vậy:

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

1
Vì đầu ra xargs wc -llà số, nên người ta thực sự cần sử dụng sort -nhoặc sort -nr.
Dustin Ingram

4

Đối với Windows , công cụ dễ dàng và nhanh chóng là LocMetrics .


Rất khó có khả năng OP có mặt trên Windows nếu họ đang sử dụng bash.

1
Cả hai tiêu đề và mô tả câu hỏi @VanessaMcHale rõ ràng không yêu cầu giải pháp duy nhất. Vì vậy, giải pháp dựa trên Windows là chấp nhận được. Google cũng chỉ cho tôi trang này khi tôi đang tìm giải pháp tương tự.
walv

Nhận xét này đã giúp tôi. Tôi đã thử điều này và nó hoạt động tốt.
Allan F

4

Một cái gì đó khác nhau:

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

Điều này hoạt động tốt, nhưng bạn cần phải có ít nhất một *.phptệp trong thư mục hiện tại hoặc một trong các thư mục con của nó, hoặc wccác quầy hàng khác


cũng có thể tràn ARG_MAX
Mark K Cowan

4

Nếu bạn đang dùng Linux (và tôi hiểu là bạn), tôi khuyên bạn nên sử dụng công cụ polyglot . Nó là nhanh hơn đáng kể so với một trong hai sloccounthoặc clocvà nó là nhiều featureful hơn sloccount.

Bạn có thể gọi nó với

poly .

hoặc là

poly

vì vậy nó thân thiện với người dùng hơn nhiều so với một số tập lệnh bash phức tạp.


4

Nó rất dễ dàng với các khối zsh:

wc -l ./**/*.php

Nếu bạn đang sử dụng bash, bạn chỉ cần nâng cấp. Hoàn toàn không có lý do để sử dụng bash.


4

Công cụ Tokei hiển thị số liệu thống kê về mã trong một thư mục. Tokei sẽ hiển thị số lượng tệp, tổng số dòng trong các tệp và mã, nhận xét và khoảng trống được nhóm theo ngôn ngữ. Tokei cũng có sẵn trên Mac, Linux và Windows.

Một ví dụ về đầu ra của Tokei như sau:

$ 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 có thể được cài đặt bằng cách làm theo các hướng dẫn trên tệp README trong kho lưu trữ .


1
Đây phải là câu trả lời được chấp nhận
Elijas

3

Nếu bạn chỉ cần tổng số dòng trong giả sử các tệp PHP của bạn, bạn có thể sử dụng lệnh một dòng rất đơn giản ngay cả trong Windows nếu bạn đã cài đặt GnuWin32. Như thế này:

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

Bạn cần xác định chính xác nơi find.exe, nếu không, Windows được cung cấp FIND.EXE (từ các lệnh giống như DOS cũ) sẽ được thực thi, vì có lẽ là trước GnuWin32 trong môi trường PATH và có các tham số và kết quả khác nhau.

Xin lưu ý rằng trong lệnh trên, bạn nên sử dụng dấu ngoặc kép, không phải dấu ngoặc đơn.


Trong ví dụ ở trên, tôi đang sử dụng bash cho windows thay vì cmd.exe, đó là lý do tại sao có dấu gạch chéo "/" và không phải dấu gạch chéo ngược "\".
Neven Boyanov

3

Trước tiên, đưa ra các tệp dài nhất (có thể các tệp dài này cần một số tình yêu tái cấu trúc?) Và loại trừ một số thư mục của nhà cung cấp:

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

3

Nếu bạn muốn giữ cho nó đơn giản, hãy cắt bỏ người trung gian và chỉ cần gọi wcvới tất cả tên tệp:

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

Hoặc theo cú pháp hiện đại:

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

Hoạt động miễn là không có khoảng trắng trong bất kỳ tên thư mục hoặc tên tệp. Và miễn là bạn không có hàng chục ngàn tệp (trình bao hiện đại hỗ trợ các dòng lệnh thực sự dài). Dự án của bạn có 74 tệp, vì vậy bạn có nhiều chỗ để phát triển.


Tôi thích cái này! Nếu bạn đang ở trong môi trường lai C / C ++:wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
Bram

thật ngạc nhiên khi nó không phải là câu trả lời hàng đầu
ms4720

3

Bạn không cần tất cả các lệnh phức tạp và khó nhớ này. Bạn chỉ cần một công cụ gọi là bộ đếm dòng .

Tổng quan nhanh

Đây là cách bạn có được công cụ

$ pip install line-counter

Sử dụng linelệnh để lấy số tập tin và số dòng trong thư mục hiện tại (đệ quy)

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

Nếu bạn muốn biết thêm chi tiết, chỉ cần sử dụng 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

Và phần tốt nhất của công cụ này là, bạn có thể thêm .gitignorenhư cấu hình tập tin vào nó. Bạn có thể thiết lập quy tắc để chọn hoặc bỏ qua loại tệp nào sẽ được tính giống như những gì bạn làm trong '.gitignore'.

Mô tả và cách sử dụng khác có tại đây: https://github.com/MorganZhang100/line-count


3

Nếu các tệp quá nhiều, tốt hơn là chỉ tìm tổng số dòng.

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

2

Ít nhất trên OS X, các lệnh find + xarg + wc được liệt kê trong một số câu trả lời khác in "tổng cộng" nhiều lần trên các danh sách lớn và không có tổng số hoàn thành được đưa ra. Tôi đã có thể nhận được tổng số duy nhất cho các tệp .c bằng lệnh sau:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.