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?
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
akan dijalankan beberapa kali. Juga tidak menangani banyak nama file khusus.find . -name "*.php" -not -path "./tests*" | xargs wc -l
Untuk satu liner lainnya:
bekerja pada nama dengan spasi, hanya menghasilkan satu nomor.
sumber
man find
.. print0 dengan xargs -0 memungkinkan Anda beroperasi pada file yang memiliki spasi atau karakter aneh lainnya dalam namanya( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Jika menggunakan versi terbaru dari Bash (atau ZSH), itu jauh lebih mudah:
Dalam Bash shell ini membutuhkan
globstar
opsi yang akan ditetapkan, jika tidak**
glob-operator tidak rekursif. Untuk mengaktifkan pengaturan ini, masalahUntuk menjadikan ini permanen, tambahkan ke salah satu file inisialisasi (
~/.bashrc
,~/.bash_profile
dll.).sumber
globstar
harus diatur agar ini berfungsi.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 telahglobstar
mengaktifkan Bash. Anda bisa memeriksanyashopt globstar
. Untuk mengaktifkannya secara eksplisit, lakukanshopt -s globstar
.ARG_MAX
jika Anda memiliki banyak.php
file, karenawc
tidak builtin.find
berisi spasi. Itu bisa diperbaiki dengan menggunakanprint0
dan--null
denganfind
danxargs
panggilan, masing-masing.Anda dapat menggunakan
cloc
utilitas 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:
sumber
cloc
adalah lintas-platform karena itu hanya skrip Perl?Pada sistem mirip UNIX, ada alat yang disebut
cloc
yang menyediakan statistik kode.Saya berlari di direktori acak di basis kode kami, katanya:
sumber
choco install cloc
Anda tidak menentukan berapa banyak file di sana atau berapa output yang diinginkan. Apa ini yang kamu cari:
sumber
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
.Variasi lain :)
Sunting: ini akan memberikan jumlah total, bukan file-demi-file.
Edit2: Tambahkan
.
setelahfind
untuk membuatnya berfungsisumber
$ find -name \*\.php -print0 | xargs -0 cat | wc -l
find . -name '*.php' | xargs cat | wc -l
... sedangkan ini memberikan file-per-file dan total keseluruhan:find . -name '*.php' | xargs wc -l
Anehnya tidak ada jawaban berdasarkan pada menemukan
-exec
danawk
. Kita mulai:Cuplikan ini ditemukan untuk semua file (
-type f
). Untuk mencari berdasarkan ekstensi file, gunakan-name
:sumber
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).wc
pada formulircat
lambat karena sistem pertama harus memproses semua GB untuk mulai menghitung garis (diuji dengan 200GB jsons, file 12k). lakukanwc
dulu lalu hitung hasilnya jauh lebih cepatfind . -type f -exec wc -l {} \+
ataufind . -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 menggunakantail
:find . -type f -exec wc -l {} \+ | tail -1
ataufind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
Lebih umum dan sederhana bagi saya, misalkan Anda perlu menghitung file dari ekstensi nama yang berbeda (misalnya, juga penduduk asli)
Terima kasih atas umpan baliknya, saya sudah memperbaikinya.
sumber
$()
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:
Baris di setiap file, diurutkan berdasarkan jalur file
Baris di setiap file, diurutkan berdasarkan jumlah baris, turun
Total baris di semua file
sumber
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.
sumber
Yang Anda inginkan adalah
for
loop sederhana :sumber
xargs
?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 tidakfind
, dan ergo tidak akan benar-benar menemukan file php di subdirektori. Juga-print
berlebihan, karena tersirat dengan tidak adanya tindakan lain.hanya untuk sumber:
untuk memfilter, cukup gunakan grep
sumber
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 menggunakanxargs
, tidak akan meluncurkan jumlah sia-sia tinggi perintah eksternal (terima kasih kepada+
untukfind
's-exec
). Ini dia:sumber
\;
alih - alih+
karena saya tidak menyadarinya), jawaban ini harus menjadi jawaban yang benar.Saya tahu pertanyaan ini ditandai sebagai pesta, 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:
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.
sumber
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
xargs
dapat 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. Theawk
total aliran file individuwc
output, sehingga seharusnya tidak pernah kehabisan ruang. Ini juga membatasiexec
hanya untuk file (melewatkan direktori):sumber
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:
akhirnya, hati-hati dengan perangkap-wc (hitungan masuk, bukan garis !!!)
sumber
grep -c ^
Anda menghitung jumlah baris tidak lengkap , dan baris tidak lengkap tersebut tidak dapat muncul dalam file teks .find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc
Lihat di sini untuk alternatifbc
: stackoverflow.com/q/926069/2400328sangat sederhana
sumber
Jika Anda ingin hasil Anda diurutkan berdasarkan jumlah baris, Anda bisa menambahkan
| sort
atau| sort -r
(-r
untuk urutan menurun) ke jawaban pertama, seperti:sumber
xargs wc -l
numerik, seseorang sebenarnya perlu menggunakansort -n
atausort -nr
.Untuk Windows , alat yang mudah dan cepat adalah LocMetrics .
sumber
Sesuatu yang berbeda:
Ini berfungsi dengan baik, tetapi Anda harus memiliki setidaknya satu
*.php
file di folder saat ini atau salah satu dari subfoldernya, atauwc
kios lainsumber
Jika Anda menggunakan Linux (dan saya mengerti), saya sarankan alat polyglot saya . Ini secara dramatis lebih cepat daripada salah satu
sloccount
ataucloc
dan lebih fitur daripadasloccount
.Anda dapat memohonnya dengan
atau
jadi jauh lebih user-friendly daripada beberapa skrip bash yang berbelit-belit.
sumber
Sangat mudah dengan zsh globs:
Jika Anda menggunakan bash, Anda hanya perlu memutakhirkan. Sama sekali tidak ada alasan untuk menggunakan bash.
sumber
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 dapat diinstal dengan mengikuti instruksi pada file README di repositori .
sumber
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:
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.
sumber
Memberikan file terlama terlebih dahulu (mis. Mungkin file panjang ini memerlukan cinta refactoring?), Dan mengecualikan beberapa direktori vendor:
sumber
Jika Anda ingin membuatnya tetap sederhana, hilangkan perantara dan panggil saja
wc
dengan semua nama file:Atau dalam sintaksis modern:
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.
sumber
wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
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
Gunakan
line
perintah untuk mendapatkan jumlah file dan jumlah baris di bawah direktori saat ini (secara rekursif)Jika Anda ingin lebih detail, gunakan saja
line -d
.Dan bagian terbaik dari alat ini adalah, Anda dapat menambahkan
.gitignore
file 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
sumber
Jika file terlalu banyak, lebih baik hanya mencari jumlah baris total.
sumber
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; }'
sumber