Bagaimana cara menghitung semua baris kode dalam direktori secara rekursif?


1625

Kami punya aplikasi PHP dan ingin menghitung semua baris kode di bawah direktori dan subdirektori tertentu. Kami tidak perlu mengabaikan komentar, karena kami hanya mencoba untuk mendapatkan ide kasar.

wc -l *.php 

Perintah itu berfungsi baik dalam direktori yang diberikan, tetapi mengabaikan subdirektori. Saya berpikir ini mungkin berhasil, tetapi mengembalikan 74, yang jelas bukan itu masalahnya ...

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

Apa sintaks yang benar untuk memberi makan di semua file?

Jawaban:


2650

Mencoba:

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

Alat SLOCCount juga dapat membantu.

Ini akan memberikan sumber baris jumlah kode yang akurat untuk hierarki apa pun yang Anda tuju, serta beberapa statistik tambahan.

Output yang diurutkan:

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


31
cloc.sourceforge.net mungkin layak dilihat sebagai alternatif untuk sloccount (lebih banyak bahasa tetapi lebih sedikit informasi)
AsTeR

31
dengan menyertakan file juga:find . -name '*.php' -o -name '*.inc' | xargs wc -l
rymo

52
Ini akan mencetak lebih dari satu nomor ketika ada banyak file (karena wcakan dijalankan beberapa kali. Juga tidak menangani banyak nama file khusus.
l0b0

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

19
Jika nama direktori berisi spasi ... perintah di atas gagal !!
nitish712

474

Untuk satu liner lainnya:

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

bekerja pada nama dengan spasi, hanya menghasilkan satu nomor.


1
1 lagi ... dicari selamanya ... semua perintah "find" lainnya hanya mengembalikan # file yang sebenarnya .... item -print0 di sini mendapatkan jumlah baris aktual untuk saya !!! Terima kasih!
Ronedog

3
@ TorbenGundtofte-Bruun - lihat man find.. print0 dengan xargs -0 memungkinkan Anda beroperasi pada file yang memiliki spasi atau karakter aneh lainnya dalam namanya
Shizzmo

2
@ TorbenGundtofte-Bruun - juga, -0 dalam xargs sesuai dengan print0, itu semacam encoding / decoding untuk menangani spasi.
Tristan Reid

7
Jika Anda memerlukan lebih dari satu filter nama, saya telah menemukan itu (setidaknya dengan versi pencarian MSYSGit), Anda memerlukan parens tambahan: ( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Zrax

1
@DesignbyAdrian: Penjurnalan membantu pemulihan kerusakan, bukan kecepatan. Kemungkinan Anda melihat kinerja yang baik karena caching atau HDD yang sangat cepat.
jmh

398

Jika menggunakan versi terbaru dari Bash (atau ZSH), itu jauh lebih mudah:

wc -l **/*.php

Dalam Bash shell ini membutuhkan globstaropsi yang akan ditetapkan, jika tidak **glob-operator tidak rekursif. Untuk mengaktifkan pengaturan ini, masalah

shopt -s globstar

Untuk menjadikan ini permanen, tambahkan ke salah satu file inisialisasi ( ~/.bashrc, ~/.bash_profiledll.).


7
Saya membatalkan ini untuk kesederhanaan, tetapi saya hanya ingin menunjukkan bahwa tampaknya tidak mencari direktori secara rekursif, itu hanya memeriksa subdirektori dari direktori saat ini. Ini pada SL6.3.
Godric Seer

7
Itu tergantung pada shell Anda dan opsi yang telah Anda tetapkan. Bash globstarharus diatur agar ini berfungsi.
Michael Wild

2
@PeterSenna, dengan arsip kernel 3,9,8 saat ini, perintah ini wc -l **/*.[ch]menemukan total 15195373 baris. Tidak yakin apakah Anda menganggap itu sebagai "nilai yang sangat rendah". Sekali lagi, Anda perlu memastikan bahwa Anda telah globstarmengaktifkan Bash. Anda bisa memeriksanya shopt globstar. Untuk mengaktifkannya secara eksplisit, lakukan shopt -s globstar.
Michael Wild

5
@MichaelWild Ini adalah solusi yang baik, tetapi masih akan meluap ARG_MAXjika Anda memiliki banyak .phpfile, karena wctidak builtin.
Pasang kembali Monica,

1
@AlbertSamuel Tidak, Anda harus membandingkan daftar file yang dihasilkan oleh kedua metode. Metode saya memiliki masalah tidak bekerja untuk sejumlah besar file, seperti yang disebutkan oleh @BroSlow. Jawaban yang diterima akan gagal jika jalur yang dihasilkan oleh findberisi spasi. Itu bisa diperbaiki dengan menggunakan print0dan --nulldengan finddan xargspanggilan, masing-masing.
Michael Wild

363

Anda dapat menggunakan clocutilitas yang dibangun untuk tujuan yang tepat ini. Ini melaporkan setiap jumlah baris dalam setiap bahasa, bersama dengan berapa banyak dari mereka adalah komentar dll. CLOC tersedia di Linux, Mac dan Windows.

Contoh penggunaan dan keluaran:

$ 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
Itu alat yang bagus yang berjalan bagus dan cepat memberikan statistik yang bermanfaat pada akhirnya. Suka.
Rob Forrest

4
Perhatikan bahwa Anda dapat menjalankan perintah Unix di Windows menggunakan cygwin (atau port / lingkungan serupa lainnya). Bagi saya, memiliki akses semacam ini sangat berguna, itu suatu keharusan. Baris perintah unix ajaib. Saya terutama suka perl dan ekspresi reguler.
Curtis Yallop

CLOC dan SLOCCount berfungsi dengan baik pada pertengahan 2015 macbook. Perhatikan jumlah mereka dekat tetapi tidak persis sama untuk proyek Android Java 127k. Perhatikan juga bahwa iOS setara memiliki 2x LoC; jadi, metrik "biaya" di SLOCCount mungkin tidak aktif (atau mungkin dev dev membuat 2x yang dibuat dev Android. :-)
maxweber

2
Apakah Anda mempertimbangkan mengedit awal pertanyaan ini untuk memperjelas bahwa itu clocadalah lintas-platform karena itu hanya skrip Perl?
Kyle Strand

Sempurna, berfungsi dengan baik di Windows bash juga, tentu saja.
yurisnm

100

Pada sistem mirip UNIX, ada alat yang disebut clocyang menyediakan statistik kode.

Saya berlari di direktori acak di basis kode kami, katanya:

      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 secara teknis simtao menyebutkannya secara khusus sebagai solusi untuk pengguna windows, tidak menyebutkan linux atau unix sama sekali.
Tim Seguine

5
@moose Table diedit ke jawabannya jauh lebih lambat dari jawaban saya, sekarang keduanya memang terlihat mirip.
Calmarius 3-15

Saya suka itu. cloc benar-benar rapi. Tapi apa artinya nama itu?
Manoel Vilela

Ada di Windows sekarang juga! Dengan asumsi Anda punya cokelat :choco install cloc
icc97

35

Anda tidak menentukan berapa banyak file di sana atau berapa output yang diinginkan. Apa ini yang kamu cari:

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

2
Ini akan berfungsi, selama tidak ada terlalu banyak file: jika ada banyak file, Anda akan mendapatkan beberapa baris sebagai hasilnya (xargs akan membagi daftar file dalam beberapa sub-daftar)
Pascal MARTIN

ah iya. Itu sebabnya saya bilang Dia tidak menentukan berapa banyak file di sana. Versi saya lebih mudah diingat, tetapi versi Shin lebih baik jika Anda memiliki lebih dari beberapa file. Saya memilihnya.
Paweł Polewicz

Aku diperlukan untuk beradaptasi ini untuk digunakan dalam fungsi, di mana tanda kutip tunggal terlalu membatasi: 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/* . } Hasil dekat dengan slocount untuk *.py, tetapi tidak tahu *.js, *.html.
jalanb

31

Variasi lain :)

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

Sunting: ini akan memberikan jumlah total, bukan file-demi-file.

Edit2: Tambahkan .setelah finduntuk membuatnya berfungsi


keduanya menjawab jumlah baris.
josh123a123

Setidaknya di cygwin, saya mendapat hasil yang lebih baik dengan:$ find -name \*\.php -print0 | xargs -0 cat | wc -l
Martin Haeberli

di Darwin, ini hanya memberikan total besar: find . -name '*.php' | xargs cat | wc -l... sedangkan ini memberikan file-per-file dan total keseluruhan:find . -name '*.php' | xargs wc -l
OsamaBinLogin

30

Anehnya tidak ada jawaban berdasarkan pada menemukan -execdan awk. Kita mulai:

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

Cuplikan ini ditemukan untuk semua file ( -type f). Untuk mencari berdasarkan ekstensi file, gunakan -name:

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

2
Secara fungsional, ini berfungsi dengan baik, tetapi pada daftar besar (sumber linux) ini sangat lambat karena memulai proses wc untuk setiap file, bukannya proses 1 wc untuk semua file. Saya menghitung waktunya pada 31 detik menggunakan metode ini dibandingkan dengan 1,5 detik menggunakan find . -name '*.c' -print0 |xargs -0 wc -l. Yang mengatakan, metode ini lebih cepat (setidaknya pada OS X), akhirnya mencetak "total" beberapa kali sehingga beberapa penyaringan tambahan diperlukan untuk mendapatkan total yang tepat (saya memposting rincian dalam jawaban saya).
Doug Richardson

Ini memiliki manfaat bekerja untuk jumlah file yang tidak terbatas. Sudah selesai dilakukan dengan baik!
ekscrypto

1
ini adalah solusi yang jauh lebih baik setelah bekerja dengan sejumlah besar GB dan file. melakukan satu wcpada formulir catlambat karena sistem pertama harus memproses semua GB untuk mulai menghitung garis (diuji dengan 200GB jsons, file 12k). lakukan wcdulu lalu hitung hasilnya jauh lebih cepat
ulkas

1
@ DougRichardson, Anda dapat mempertimbangkan ini sebagai gantinya: find . -type f -exec wc -l {} \+atau find . -name '*.py' -type f -exec wc -l {} \+ yang mencetak total pada akhir output. Jika yang Anda minati adalah total, maka Anda bisa melangkah lebih jauh dan menggunakan tail: find . -type f -exec wc -l {} \+ | tail -1ataufind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
JamieJag

25

Lebih umum dan sederhana bagi saya, misalkan Anda perlu menghitung file dari ekstensi nama yang berbeda (misalnya, juga penduduk asli)

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

Terima kasih atas umpan baliknya, saya sudah memperbaikinya.


6
ini tidak melakukan apa yang Anda pikirkan. Temukan . -nama ' . [am]' identik dengan menemukan. -nama ' . [a | m]' keduanya akan menemukan semua file yang berakhiran .m atau .a
Omry Yadan

1
tetapi yang kedua juga akan menemukan file yang diakhiri dengan. | , jika ada. Jadi [h | c | cpp | php | cc] pada akhirnya sama dengan [hcp |].
OsamaBinLogin

backticks sudah usang, lebih disukai$()
Sandburg

Ini bekerja di bawah Cygwin. Tentu saja, drive "C: \" harus mengikuti konvensi cygwin, seperti misalnya: wc $ (find / cygdrive / c // SomeWindowsFolderj / -type f | egrep "\. (H | c | cpp | php | cc) ")
Christian Gingras

21

POSIX

Tidak seperti kebanyakan jawaban lain di sini, ini bekerja pada sistem POSIX, untuk sejumlah file, dan dengan nama file apa pun (kecuali jika disebutkan).


Baris di setiap file:

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

Baris di setiap file, diurutkan berdasarkan jalur file

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

Baris di setiap file, diurutkan berdasarkan jumlah baris, turun

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

Total baris di semua file

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

19

Ada alat kecil yang disebut sloccount untuk menghitung baris kode dalam direktori. Perlu dicatat bahwa ia melakukan lebih dari yang Anda inginkan karena mengabaikan baris / komentar kosong, mengelompokkan hasil per bahasa pemrograman dan menghitung beberapa statistik.


Untuk windows, LocMetrics melakukan pekerjaannya
Camille

15

Yang Anda inginkan adalah forloop sederhana :

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

3
bukankah ini berlebihan dibandingkan dengan jawaban yang menyarankan xargs?
Nathan Fellman

5
Tidak, Nathan. Jawaban xargs tidak harus mencetak hitungan sebagai satu nomor. Mungkin hanya mencetak banyak subtotal.
Rob Kennedy

3
apa yang akan dilakukan program ini jika nama file berisi spasi? Bagaimana dengan baris baru? ;-)
Paweł Polewicz

38
Jika nama file Anda berisi baris baru, saya akan mengatakan Anda memiliki masalah yang lebih besar.
Kzqai

2
@ennuikiller Jumlah masalah dengan ini, pertama-tama akan pecah pada file dengan spasi putih. Pengaturan IFS=$'\n'sebelum loop setidaknya akan memperbaikinya untuk semua kecuali file dengan baris baru di namanya. Kedua, Anda tidak mengutip '*.php', jadi itu akan diperluas oleh shell dan tidak find, dan ergo tidak akan benar-benar menemukan file php di subdirektori. Juga -printberlebihan, karena tersirat dengan tidak adanya tindakan lain.
Pasang kembali Monica, Tolong

12

hanya untuk sumber:

wc `find`

untuk memfilter, cukup gunakan grep

wc `find | grep .php$`

11

Yang mudah yang akan cepat, akan menggunakan semua kekuatan pencarian / penyaringan find, tidak gagal ketika ada terlalu banyak file (jumlah argumen melimpah), bekerja dengan baik dengan file dengan simbol lucu di namanya, tanpa menggunakan xargs, tidak akan meluncurkan jumlah sia-sia tinggi perintah eksternal (terima kasih kepada +untuk find's -exec). Ini dia:

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

2
Saya akan memposting varian ini sendiri (dengan \;alih - alih +karena saya tidak menyadarinya), jawaban ini harus menjadi jawaban yang benar.
Mark K Cowan

7

Saya tahu pertanyaan ini ditandai sebagai , tetapi tampaknya masalah yang Anda coba selesaikan juga terkait PHP.

Sebastian Bergmann menulis alat yang disebut PHPLOC yang melakukan apa yang Anda inginkan dan di atas itu memberi Anda gambaran tentang kompleksitas proyek. Ini adalah contoh dari laporannya:

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

Seperti yang Anda lihat, informasi yang diberikan jauh lebih bermanfaat dari perspektif pengembang, karena secara kasar dapat memberi tahu Anda betapa rumitnya sebuah proyek sebelum Anda mulai bekerja dengannya.


7

Kira tidak ada yang akan melihat ini terkubur di belakang ... Namun tidak ada jawaban sejauh ini pada masalah nama file dengan spasi. Selain itu, semua yang digunakan xargsdapat gagal jika panjang total path di pohon melebihi batas ukuran lingkungan shell (default ke beberapa megabyte di Linux). Berikut adalah salah satu yang memperbaiki masalah ini secara langsung. Subshell menangani file dengan spasi. The awktotal aliran file individu wcoutput, sehingga seharusnya tidak pernah kehabisan ruang. Ini juga membatasi exechanya untuk file (melewatkan direktori):

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

6

WC -L? lebih baik gunakan GREP -C ^

wc -l? Salah! perintah wc menghitung kode baris baru, bukan baris! Ketika baris terakhir dalam file tidak berakhir dengan kode baris baru, ini tidak akan dihitung!

jika Anda masih ingin menghitung baris, gunakan grep -c ^ , contoh lengkap:

#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

akhirnya, hati-hati dengan perangkap-wc (hitungan masuk, bukan garis !!!)


Silakan baca definisi POSIX dari sebuah baris . Dengan grep -c ^Anda menghitung jumlah baris tidak lengkap , dan baris tidak lengkap tersebut tidak dapat muncul dalam file teks .
gniourf_gniourf

2
Saya tahu itu. Dalam praktiknya, hanya baris terakhir yang tidak lengkap karena tidak memiliki EOL. Ide menghitung semua baris termasuk yang tidak lengkap. Ini adalah kesalahan yang sangat sering, hanya menghitung garis lengkap. setelah menghitung kita berpikir "kenapa aku melewatkan baris terakhir ???". Inilah jawaban mengapa, dan resep bagaimana melakukannya dengan benar.
Znik

Atau, jika Anda menginginkan satu liner: find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc Lihat di sini untuk alternatif bc: stackoverflow.com/q/926069/2400328
techniao

4

sangat sederhana

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

1
itu akan gagal jika ada spasi atau baris baru di salah satu nama file
Paweł Polewicz

4

Jika Anda ingin hasil Anda diurutkan berdasarkan jumlah baris, Anda bisa menambahkan | sortatau | sort -r( -runtuk urutan menurun) ke jawaban pertama, seperti:

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

1
Karena output berupa xargs wc -lnumerik, seseorang sebenarnya perlu menggunakan sort -natau sort -nr.
Dustin Ingram

4

Untuk Windows , alat yang mudah dan cepat adalah LocMetrics .


OP sangat tidak mungkin ada di Windows jika mereka menggunakan bash.

1
@VanessaMcHale judul pertanyaan dan deskripsi keduanya tidak jelas memerlukan solusi unix-only. Jadi solusi berbasis Windows dapat diterima. Google juga menunjuk saya ke halaman ini ketika saya mencari solusi yang sama.
walv

Komentar ini membantu saya. Saya mencoba ini dan itu bekerja dengan baik.
Allan F

4

Sesuatu yang berbeda:

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

Ini berfungsi dengan baik, tetapi Anda harus memiliki setidaknya satu *.phpfile di folder saat ini atau salah satu dari subfoldernya, atau wckios lain


mungkin juga meluap ARG_MAX
Mark K Cowan

4

Jika Anda menggunakan Linux (dan saya mengerti), saya sarankan alat polyglot saya . Ini secara dramatis lebih cepat daripada salah satu sloccountatau clocdan lebih fitur daripada sloccount.

Anda dapat memohonnya dengan

poly .

atau

poly

jadi jauh lebih user-friendly daripada beberapa skrip bash yang berbelit-belit.


4

Sangat mudah dengan zsh globs:

wc -l ./**/*.php

Jika Anda menggunakan bash, Anda hanya perlu memutakhirkan. Sama sekali tidak ada alasan untuk menggunakan bash.


4

Alat Tokei menampilkan statistik tentang kode dalam direktori. Tokei akan menunjukkan jumlah file, total baris dalam file dan kode, komentar, dan kosong yang dikelompokkan berdasarkan bahasa. Tokei juga tersedia di Mac, Linux, dan Windows.

Contoh dari output Tokei adalah sebagai berikut:

$ 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 dapat diinstal dengan mengikuti instruksi pada file README di repositori .


1
Ini seharusnya jawaban yang diterima
Elijas

3

Jika Anda hanya perlu jumlah total baris di katakanlah file PHP Anda, Anda dapat menggunakan perintah satu baris yang sangat sederhana bahkan di bawah Windows jika Anda menginstal GnuWin32. Seperti ini:

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

Anda perlu menentukan di mana tepatnya find.exe jika Windows disediakan FIND.EXE (dari perintah seperti DOS lama) akan dieksekusi, karena mungkin sebelum GnuWin32 di PATH lingkungan, dan memiliki parameter dan hasil yang berbeda.

Harap dicatat bahwa dalam perintah di atas Anda harus menggunakan tanda kutip kembali, bukan tanda kutip tunggal.


Pada contoh di atas, saya menggunakan bash untuk windows alih-alih cmd.exe itu sebabnya ada garis miring "/" dan bukan garis miring "\".
Neven Boyanov

3

Memberikan file terlama terlebih dahulu (mis. Mungkin file panjang ini memerlukan cinta refactoring?), Dan mengecualikan beberapa direktori vendor:

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

3

Jika Anda ingin membuatnya tetap sederhana, hilangkan perantara dan panggil saja wcdengan semua nama file:

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

Atau dalam sintaksis modern:

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

Bekerja selama tidak ada spasi di nama direktori atau nama file. Dan selama Anda tidak memiliki puluhan ribu file (shell modern mendukung baris perintah yang sangat panjang). Proyek Anda memiliki 74 file, jadi Anda punya banyak ruang untuk tumbuh.


Saya suka yang ini! Jika Anda berada di lingkungan hybrid C / C ++:wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
Bram

terkejut itu bukan jawaban teratas
ms4720

3

Anda tidak perlu semua perintah yang rumit dan sulit diingat ini. Anda hanya perlu alat yang disebut penghitung garis .

Gambaran singkat

Inilah cara Anda mendapatkan alat

$ pip install line-counter

Gunakan lineperintah untuk mendapatkan jumlah file dan jumlah baris di bawah direktori saat ini (secara rekursif)

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

Jika Anda ingin lebih detail, gunakan saja 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

Dan bagian terbaik dari alat ini adalah, Anda dapat menambahkan .gitignorefile seperti configure ke dalamnya. Anda dapat mengatur aturan untuk memilih atau mengabaikan jenis file yang akan dihitung seperti apa yang Anda lakukan di '.gitignore'.

Deskripsi dan penggunaan lebih lanjut ada di sini: https://github.com/MorganZhang100/line-counter


3

Jika file terlalu banyak, lebih baik hanya mencari jumlah baris total.

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

2

Pada OS X setidaknya, perintah find + xarg + wc yang tercantum dalam beberapa jawaban lain mencetak "total" beberapa kali pada daftar besar, dan tidak ada total lengkap yang diberikan. Saya bisa mendapatkan total tunggal untuk file .c menggunakan perintah berikut:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.