jika saya ingin menghitung baris kode, hal yang sepele adalah
cat *.c *.h | wc -l
Tetapi bagaimana jika saya memiliki beberapa subdirektori?
recursive
source-code
Niklas
sumber
sumber
cat
?wc -l *.c *.h
melakukan hal yang sama.wc -l *.c *.h | tail -n 1
mendapatkan hasil yang serupa.**
, sehingga Anda bisa menggunakanwc -l **/*.{h,c}
atau sesuatu yang serupa. Perhatikan bahwa dalam Bash, setidaknya, opsi ini (dipanggilglobstar
) tidak aktif secara default. Tetapi juga perhatikan bahwa dalam kasus khusus ini,cloc
atauSLOCCount
merupakan pilihan yang jauh lebih baik. (Juga,ack
mungkin lebih disukaifind
untuk mencari / mendaftar file sumber dengan mudah.)Jawaban:
Cara termudah adalah dengan menggunakan alat yang disebut
cloc
. Gunakan seperti ini:Itu dia. :-)
sumber
Anda mungkin harus menggunakan SLOCCount atau cloc untuk ini, mereka dirancang khusus untuk menghitung baris kode sumber dalam suatu proyek, terlepas dari struktur direktori dll .; antara
atau
akan menghasilkan laporan tentang semua kode sumber mulai dari direktori saat ini.
Jika Anda ingin menggunakan
find
danwc
, GNUwc
memiliki--files0-from
opsi yang bagus :(Terima kasih kepada SnakeDoc untuk saran cloc !)
sumber
sloccount /tmp/stackexchange
(dibuat lagi pada 17 Mei setelah reboot terbaru saya) mengatakan bahwa perkiraan biaya untuk mengembangkan file sh, perl, awk, dll itu ditemukan adalah $ 11.029. dan itu tidak termasuk one-liner yang tidak pernah membuatnya menjadi file skrip.cloc
juga bagus: github.com/AlDanial/clocKarena
wc
perintah dapat mengambil banyak argumen, Anda bisa meneruskan semua nama file untukwc
menggunakan+
argumen-exec
tindakan GNUfind
:Bergantian, dalam
bash
, menggunakan opsi shellglobstar
untuk menelusuri direktori secara rekursif:Kerang lain melintasi secara rekursif secara default (misalnya
zsh
) atau memiliki opsi serupa sepertiglobstar
, paling tidak sebagian besar.sumber
Anda dapat menggunakannya
find
bersama denganxargs
danwc
:sumber
total
baris jika beberapawc
sedang dipanggil.)wc
perintah dapat diatasi dengan perpipaanfind
kewhile read FILENAME; do . . .done
struktur. Dan di dalam penggunaan whilewc -l
. Sisanya menjumlahkan garis total menjadi variabel dan menampilkannya.Jika Anda berada di lingkungan di mana Anda tidak memiliki akses ke
cloc
dll saya sarankanRun-through:
find
mencari secara rekursif untuk semua file biasa yang namanya berakhir dengan salah.c
atau.h
dan menjalankannyacat
. Output disalurkan melaluigrep
untuk menghitung semua baris non-kosong (yang berisi setidaknya satu karakter non-spasi).sumber
Seperti telah ditunjukkan di komentar,
cat file | wc -l
ini tidak setara denganwc -l file
karena mantan mencetak hanya sejumlah sedangkan cetakan kedua nomor dan nama file. Demikian jugacat * | wc -l
akan mencetak hanya angka, sedangkanwc -l *
akan mencetak garis informasi untuk setiap file.Dalam semangat kesederhanaan, mari kita kembali ke pertanyaan yang sebenarnya ditanyakan:
Pertama, Anda bahkan dapat menyederhanakan perintah sepele Anda menjadi:
Dan akhirnya, banyak-subdirektori yang setara adalah:
Ini mungkin dapat ditingkatkan dengan banyak cara, seperti membatasi file yang cocok hanya file biasa (bukan direktori) dengan menambahkan
-type f
— tetapifind
perintah yang diberikan adalah setara rekursif yang tepatcat *.[ch]
.sumber
Sampel menggunakan
awk
:sumber
+
di tempat\;
.wc -l
untuk kelompok file, lebih tepatnya sepertixargs
tidak, tetapi menangani karakter aneh-bola (seperti spasi) dalam nama file tanpa perlu salah satuxargs
atau (non-standar)-print0
dan-0
opsi untukfind
danxargs
masing - masing. Ini optimasi kecil. Kelemahannya adalah bahwa setiap doawc
akan menghasilkan jumlah baris total pada akhir ketika diberikan banyak file -awk
skrip akan berurusan dengan itu. Jadi, ini bukan slam-dunk, tetapi sangat sering, menggunakan+
di tempat\;
denganfind
adalah ide yang bagus.wc
. Jika tidak diketahui apriori jumlah file yang akan ditemukan , apakah ada risiko untuk melewati batas itu atau entah bagaimana itu ditangani oleh find?find
mengelompokkan file ke dalam bundel ukuran yang nyaman, yang tidak akan melebihi batas panjang untuk daftar argumen pada platform, memungkinkan untuk lingkungan (yang keluar dari panjang daftar argumen - sehingga panjang daftar argumen ditambah dengan panjang lingkungan harus kurang dari nilai maksimum). TKI,find
melakukan pekerjaan dengan benar, sepertixargs
melakukan pekerjaan dengan benar.perintah mudah:
sumber
total
baris jika beberapawc
sedang dipanggil.)Jika Anda menggunakan Linux, saya merekomendasikan alat saya sendiri, polyglot . Ini secara dramatis lebih cepat daripada
cloc
dan lebih fitur daripadasloccount
.Anda harus dapat membangun BSD juga, meskipun tidak ada binari yang disediakan.
Anda dapat memohonnya dengan
sumber
find . -name \*.[ch] -print | xargs -n 1 wc -l
harus melakukan trik. Ada beberapa variasi yang mungkin mengenai hal itu juga, seperti menggunakan-exec
alih-alih menyalurkan output kewc
.sumber
find . -name \*.[ch] -print
tidak mencetak isi file, hanya nama file. Jadi saya menghitung jumlah file bukan? Apakah saya perlu `xargs '?xargs
, dan Anda juga harus menonton untuk beberapawc
permintaan jika Anda memiliki banyak file; Anda harus mencari semuatotal
garis dan menjumlahkannya.find . -name \*.[ch] -print0 | xargs -0 cat | wc -l
find . -name \*.[ch] -print | wc -l
) menghitung jumlah file (kecuali nama file berisi baris baru - tapi itu sangat tidak biasa) - ini tidak menghitung jumlah baris dalam file.