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?

pengguna77413
sumber

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

Peter Elespuru
sumber
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.

Shizzmo
sumber
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.).

Michael Wild
sumber
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
-------------------------------------------------------------------------------
simao
sumber
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
-------------------------------------------------------------------------------
Calmarius
sumber
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
Paweł Polewicz
sumber
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

Motiejus Jakštys
sumber
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; }'
jonhattan
sumber
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.

sergeych
sumber
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
Paul Draper
sumber
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.

sebasgo
sumber
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"
ennuikiller
sumber
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$`
kekszumquadrat
sumber
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
gniourf_gniourf
sumber
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.

Mendongkrak
sumber
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}' 
Gene
sumber
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 !!!)

Znik
sumber
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
ghostdog74
sumber
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
Paul Pettengill
sumber
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 .

walv
sumber
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

nav
sumber
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.


sumber
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.

Wajah bahagia
sumber
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 .

Joel Ellis
sumber
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.

Neven Boyanov
sumber
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
Mat
sumber
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.

Alexis
sumber
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

Morgan Zhang
sumber
3

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

find . -name '*.php' | xargs wc -l | grep -i ' total' | awk '{print $1}'
bharath
sumber
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; }'

Doug Richardson
sumber