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


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

wc -l *.php 

Lệnh đó hoạt động 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ó đang trở lại 74, mà chắc chắn không phải là trường hợp ...

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

Cú pháp chính xác để nạp vào tất cả các tệp là gì?


1260
2017-08-31 17:42


gốc


Bản sao chính xác của Cách đếm các dòng mã bao gồm các thư mục con - Dan Dascalescu


Các câu trả lời:


Thử:

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

Công cụ SLOCCount cũng có thể giúp ích.

Nó sẽ cung cấp một dòng mã nguồn chính xác cho bất cứ điều gì hệ thống phân cấp bạn trỏ nó vào, cũng như một số số liệu thống kê bổ sung.


2154
2017-08-31 17:50



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
với các tệp bao gồm: find . -name '*.php' -o -name '*.inc' | xargs wc -l - rymo
Điều này sẽ in nhiều hơn một số khi có nhiều tệp (vì wc sẽ được chạy nhiều lần. Cũng không xử lý nhiều tên tập tin đặc biệt. - l0b0
@idober: find . -name "*.php" -not -path "./tests*" | xargs wc -l - endre
Nếu tên thư mục chứa bất kỳ dấu cách nào ... lệnh trên sẽ không thành công !! - nitish712


Đố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 các tên có dấu cách, chỉ xuất ra một số.


394
2017-08-31 20:26



+1 cho -print0/-0 - Dennis Williamson
+1 ditto ... tìm kiếm mãi mãi ... tất cả các lệnh "tìm" khác chỉ trả lại số tệp thực tế .... các công cụ -print0 ở đây nhận được số dòng thực tế cho tôi !!! cảm ơn! - Ronedog
@ TorbenGundtofte-Bruun - xem man find .. print0 với xargs -0 cho phép bạn thao tác trên các tệp có dấu cách hoặc các ký tự lạ khác trong tên của chúng - Shizzmo
@ TorbenGundtofte-Bruun - cũng, -0 trong xargs tương ứng với print0, đó là loại mã hóa / giải mã để xử lý các không gian. - Tristan Reid
Nếu bạn cần nhiều hơn một bộ lọc tên, tôi đã tìm thấy rằng (ít nhất là với phiên bản tìm kiếm MSYSGit), bạn cần thêm parens: ( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l - Zrax


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

wc -l **/*.php

Trong shell Bash, điều này đòi hỏi globstar tùy chọn được thiết lập, nếu không thì ** glob-operator không đệ quy. Để bật cài đặt này, vấn đề

shopt -s globstar

Để thực hiện đ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_profile v.v.)


350
2018-02-04 15:11



Tôi upvoting 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 đệ quy, nó chỉ kiểm tra các thư mục con của thư mục hiện hành. Đây là trên SL6.3. - Godric Seer
Điều đó phụ thuộc vào trình bao của bạn và các tùy chọn bạn đã đặt. Bash yêu cầu globstar được thiết lập để làm việc này. - Michael Wild
@MichaelWild, và nếu tôi cần nhiều dòng mã hơn điều này có thể xử lý được thì sao? Nó đang trả về một giá trị rất thấp cho nhân Linux ... - Peter Senna
@PeterSenna, với bản lưu trữ kernel 3.9.8 hiện tại, lệnh wc -l **/*.[ch] tìm thấy tổng số 15195373 dòng. Không chắc 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 có globstar được kí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
@MichaelWild Đây là một giải pháp tốt, nhưng nó vẫn tràn ARG_MAX nếu bạn có một số lượng lớn .php tệp, kể từ wc không được xây dựng. - BroSlow


Bạn có thể dùng cloc tiện ích được xây dựng cho mục đích chính xác này. Nó báo cáo mỗi số dòng trong mỗi ngôn ngữ, cùng với bao nhiêu trong số đó là các chú thích, v.v.

Ví dụ về cách 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
-------------------------------------------------------------------------------

216
2018-02-25 18:29



Đó là một công cụ đáng yêu chạy tốt đẹp và nhanh chóng cung cấp số liệu thống kê hữu ích ở cuối. Yêu nó. - Rob Forrest
Nó hoạt động trên Unix một cách độc đáo. Và chỉ là một kịch bản. - bobah
Lưu ý rằng bạn có thể chạy các lệnh Unix trên Windows bằng cách sử dụng Cygwin (hoặc các cổng / môi trường tương tự khác). Đối với tôi, việc truy cập loại này cực kỳ hữu ích, đó là đ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 vào macbook giữa năm 2015. Lưu ý số của họ là gần nhưng không chính xác như nhau cho 127k dự án Java Android. Cũng lưu ý rằng iOS tương đương có 2x the LoC; vì vậy, chỉ số "chi phí" trong SLOCCount có thể bị tắt (hoặc có thể iOS dev tạo ra 2x những gì mà Android dev tạo ra. :-) - maxweber
Bạn có cân nhắc việc chỉnh sửa phần đầu của câu hỏi này để làm rõ rằng cloc là nền tảng vì nó chỉ là một kịch bản Perl? - Kyle Strand


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

Tôi chạy trên 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
-------------------------------------------------------------------------------

87
2018-05-16 16:03



Đây là trang web cho CLOC: cloc.sourceforge.net - Gabriel
Đây là câu trả lời tương tự như simao đã đưa ra trong năm 2011. - Martin Thoma
@moose kỹ thuật simtao đã đề cập đến nó cụ thể như là một giải pháp cho người dùng windows, không đề cập đến Linux hoặc unix ở tất cả. - Tim Seguine
@moose Bảng đã được chỉnh sửa vào câu trả lời của mình nhiều hơn sau câu trả lời của tôi, bây giờ hai thực sự trông giống nhau. - Calmarius
@ManoelVilela cloc = "đếm các dòng mã" - Michael Geary


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

30
2017-08-31 17:48



Đ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, bạn sẽ nhận được một số dòng kết quả (xargs sẽ chia danh sách tệp trong một số danh sách phụ) - Pascal MARTIN
ah, vâng. Đó là lý do tại sao tôi nói Anh ấy không chỉ rõ có bao nhiêu tệp. Phiên bản của tôi dễ nhớ hơn, nhưng phiên bản của Shin thì 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. - Paweł Polewicz
Tôi cần phải điều chỉnh điều này để sử dụng trong một hàm, trong đó dấu nháy đơn quá hạn chế: 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/* . }   Các kết quả gần sát với *.py, nhưng nó không biết *.js, *.html. - jalanb


Tuy nhiên, một biến thể khác :)

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

Chỉnh sửa: điều này sẽ cung cấp tổng số tiền, thay vì tệp theo từng tệp.


20
2017-08-01 12:01



Điều này sử dụng một antipattern! sử dụng mèo vô dụng! - josh123a123
@ josh123a123, có một ý tưởng tốt hơn làm thế nào để cung cấp cho một tổng hợp? - Motiejus Jakštys
Câu trả lời được chấp nhận chỉ là: tìm. -name '* .php' | xargs wc -l nếu bạn sẽ thấy dòng này vượt qua sự cần thiết của mèo và trực tiếp thêm kết quả từ tìm đến các đối số của wc. những gì câu trả lời của bạn làm là vượt qua các kết quả từ tìm đến con mèo sau đó để wc, mèo là một bước không cần thiết. - josh123a123
Câu trả lời của tôi thực hiện một điều khác - nó tính tổng các dòng mã cho tất cả các tệp. Đã chỉnh sửa câu trả lời. - Motiejus Jakštys
cả hai câu trả lời tổng hợp các dòng. - josh123a123


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ó không nhiều hơn bạn muốn vì nó bỏ qua các dòng / chú thích 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ê.


17
2017-08-31 17:52