Kod satırlarını mı sayıyorsunuz?


24

Eğer kod satırlarını saymak istersem, önemsiz şey

cat *.c *.h | wc -l

Peki ya birkaç alt dizinim varsa?



3
Konu dışı: Neden gereksiz cat? wc -l *.c *.haynı şeyi yapar.
Thomas Padron-McCarthy,

5
@ ThomasPadron-McCarthy Hayır, değil. wc -l *.c *.h | tail -n 1Benzer bir çıktı almanız gerekir .
Gilles 'SO- kötülük' dur

2
Bazı (muhtemelen çoğunda bile) modern mermilerin (Bash v4, Zsh, muhtemelen daha fazlası) **, kullanmanız wc -l **/*.{h,c}veya buna benzer bir şey kullanmanız için özyinelemeli bir genelleme mekanizması sağladığını unutmayın . Bash'de en azından bu seçeneğin (çağrılan globstar) varsayılan olarak kapalı olduğunu unutmayın. Ama aynı zamanda bu özel durumda, clocya SLOCCountda çok daha iyi bir seçenek olduğunu unutmayın. (Ayrıca, kaynak dosyaları kolayca bulmak / listelemek için acktercih findedilebilir.)
Kyle Strand

5
wc -l, kod satırlarını değil satırları sayar. 7000 boş satır hala wc -l içinde görünecek, ancak bir kod ölçütünde sayılmaz. (yorumlar da genellikle sayılmaz)
coteyr

Yanıtlar:


49

En kolay yol denilen aracı kullanmaktır cloc. Bu şekilde kullanın:

cloc .

Bu kadar. :-)


1
-1 çünkü bu program küçük, sıkıcı beyninin dışındaki dillerde kod satırlarını tanımanın bir yolunu bulamıyor. Ada ve Pascal ve C ve C ++ ve Java ve JavaScript ve "kurumsal" tür dilleri bilir, ancak SLOC'yi sadece dosya uzantısıyla saymayı reddeder ve bu nedenle DSL'ler için tamamen yararsızdır, hatta sadece bilmediği diller olur hakkında.
kedi,

21
@ cat Hiçbir şey mükemmel değildir ve hiçbir şey geçmiş ve gelecekteki tüm taleplerinizi yerine getiremez.
Ho1

2
CLOC'un kabul etmeyi reddettiği programlama dili gerçekten geçmiş ve gelecekteki tüm taleplerimi yerine getiriyor :)
kedi

6
@ cat CLOC belgelerine göre bir dil tanım dosyasında okuyabilir, bu yüzden tanımlamamış olduğu dillerdeki kodu tanımanın bir yolu vardır. Ayrıca açık kaynak kodudur, böylece daha iyi hale getirmek için her zaman genişletebilirsiniz!
Centimane

39

Muhtemelen bunun için SLOCCount veya cloc kullanmalısınız , bunlar özellikle bir projedeki kaynak kod satırlarını saymak için, yani dizin yapısından vb. Bağımsız olarak tasarlanmıştır; ya

sloccount .

veya

cloc .

Geçerli dizinden başlayan tüm kaynak kodları hakkında bir rapor üretecektir.

Kullanmak istiyorsanız findve wcGNU’nun wchoş bir --files0-fromseçeneği var:

find . -name '*.[ch]' -print0 | wc --files0-from=-

(Sayesinde SnakeDoc için cloc önerisi !)


Sloccount için +1. İlginçtir ki, çalışan sloccount /tmp/stackexchange(en son yeniden başlatmamdan sonra 17 Mayıs'ta yeniden yaratıldı), bulduğu sh, perl, awk, etc dosyalarını geliştirmek için tahmini maliyetin 11.029 $ olduğunu söylüyor. ve bu asla bir betik dosyasına girmeyen tek gömlekleri içermez.
Cas

11
Kod satırlarına göre maliyet tahmini? Peki ya spagetti'yi sürdürülebilir bir şey haline getirmek için çalışan tüm insanlar?
Monica

@OrangeDog her zaman ek yükü hesaba katabilirsiniz; hesaplama (çok eski maaş verileriyle birlikte) ve ince ayar yapabileceğiniz parametrelerin açıklaması için belgelere bakın .
Stephen Kitt,


@StephenKitt> Yine de, asıl mesele geriye sayıyor. Kodu temizlerken, genellikle daha az satırla karşılaşırsınız. Elbette kaldırılmış olanı hesaba katarak kodun geri kalanını sağlamak için bir ek yükü elden çıkarmaya çalışabilirsiniz, ancak ilk önce tüm fiyatı tahmin etmekten daha iyi bir şey göremiyorum.
spektrumlar

10

As wckomutu birden fazla argüman alabilir, sadece tüm dosya adlarını geçebilir wckullanarak +bir argüman -execGNU eylem find:

find . -type f -name '*.[ch]' -exec wc -l {} +

Alternatif olarak, dizinleri yinelemeli olarak değiştirmek bashiçin kabuk seçeneğini kullanarak globstar:

shopt -s globstar
wc -l **/*.[ch]

Diğer mermiler, varsayılan olarak (örneğin zsh) yinelemeli olarak hareket eder veya globstaren azından çoğu gibi benzer bir seçeneğe sahiptir .


1
Standart olmayan bir yazılımın root olmadığı bir makineye yüklememe gerek olmadığı için +1
Bamboomy

5

Sen kullanabilirsiniz findbirlikte xargsve wc:

find . -type f -name '*.h' -o -name '*.c' | xargs wc -l

2
(dosya yollarının boşluk, satırsonu, tek tırnak işareti, ters eğik çizgi karakterinin çift tırnak işareti içermediğini varsayar. Ayrıca totalbirkaç wcsaniye çağrılırsa birkaç satır çıktı verebilir .)
Stéphane Chazelas

Belki de birkaç wckomut sorunu yapıyı boruya findalarak çözülebilir while read FILENAME; do . . .done. Ve süre döngü kullanımı içinde wc -l. Gerisi toplam satırları bir değişkende toplar ve görüntüler.
Sergiy Kolodyazhnyy

5

clocVb erişiminiz olmadığı bir ortamdaysanız, öneririm

find -name '*.[ch]' -type f -exec cat '{}' + | grep -c '[^[:space:]]'

findGeçiş Yapma : adı .cveya sonunda biten .hve catüzerinde çalışan tüm normal dosyaları yinelemeli olarak arar . Çıktı, greptüm boş olmayan satırları (en az bir boşluk içermeyen karakter içerenler) saymak için yönlendirilir .


4

Açıklamalarda belirttiği gibi, cat file | wc -lolduğu değil eşdeğer wc -l fileikincisi baskılar bir sayı ve dosya adı ise eski baskılar nedeniyle sadece bir sayı. Aynı şekilde cat * | wc -lsadece bir sayı basacaktır, oysa wc -l *her dosya için bir bilgi satırı yazacaktır.

Basitlik ruhu içinde, gerçekten sorulan soruyu tekrar gözden geçirelim:

Eğer kod satırlarını saymak istersem, önemsiz şey

cat *.c *.h | wc -l

Peki ya birkaç alt dizinim varsa?

İlk olarak, önemsiz komutunuzu bile basitleştirmek için:

cat *.[ch] | wc -l

Ve son olarak, birçok alt dizine eşdeğer:

find . -name '*.[ch]' -exec cat {} + | wc -l

Bu, eşleştirilen dosyaların yalnızca normal dosyalara (dizinlere değil) eklenmesiyle sınırlandırılması gibi birçok yolla geliştirilebilir, -type fancak verilen findkomut tam özyinelemeli bir eşdeğerdir cat *.[ch].


3

Kullanarak örnek awk:

find . -name '*.[ch]' -exec wc -l {} \; |
  awk '{SUM+=$1}; END { print "Total number of lines: " SUM }'

Kullanım +yerine \;.
Jonathan Leffler

@JonathanLeffler Neden?
Hastur

1
@Hastur: Bu ishal wc -l, gibi oldukça dosyaların grupları için xargsyapar, ama ya ihtiyaç duymadan dosya adlarında (boşluklar) gibi garip top karakterleri kolları xargsya da (standart dışı) -print0ve -0seçenekler için findve xargssırasıyla. Küçük bir optimizasyon. Dezavantajı, her bir çağrının wcbirden fazla dosya verildiğinde sonuçta bir toplam satır sayımı awküretmesi olacaktır - senaryo bununla ilgilenir. Yani, kullanarak, çok sık bir Slam-Dunk değil, ama +yerine \;birlikte findiyi bir fikirdir.
Jonathan Leffler

@JonathanLeffler Teşekkürler. Katılıyorum. Ancak endişelerim, iletilen parametre dizesinin uzunluğu ile ilgiliydi wc. Eğer bilinmeyen önsel edilecek dosya sayısı Bulunan bu limiti geçmesi riski vardır ya nasılsa Bul tarafından işlenir?
Hastur

2
@Hastur: findDosyaları platformdaki bağımsız değişkenler listesinin uzunluk sınırını aşmayacak şekilde uygun boyuttaki paketler halinde gruplandırır ve ortamın (bağımsız değişkenler listesinin uzunluğu dışında kalan) (yani bağımsız değişken listesinin uzunluğu artı ortamın uzunluğu maksimum değerden az olmalıdır). IOW, findiş doğru xargsmu, iş doğru mu?
Jonathan Leffler

1

kolay komut:

find . -name '*.[ch]' | xargs wc -l

(dosya yollarının boşluk, satırsonu, tek tırnak işareti, ters eğik çizgi karakterinin çift tırnak işareti içermediğini varsayar. Ayrıca totalbirkaç wcsaniye çağrılırsa birkaç satır çıktı verebilir .)
Stéphane Chazelas

0

Linux kullanıyorsanız, kendi aracımı öneririm, polyglot . Çok daha hızlı clocve daha özellikli sloccount.

Sağlanan ikili dosyalar olmasa da, BSD'yi de kurabilmelisiniz.

İle çağırabilirsin

poly .

-2

find . -name \*.[ch] -print | xargs -n 1 wc -lhile yapmalı. Bunun yanı sıra, -execçıkışı borulamak yerine kullanmak gibi birkaç olası farklılıklar vardır wc.


4
Ancak find . -name \*.[ch] -printdosyaların içeriğini yazdırmaz, yalnızca dosya adlarını yazdırır. Bu yüzden dosya sayısını sayarım, değil mi? Xargs'a ihtiyacım var mı?
Niklas

@ Programmer400 evet, ihtiyacınız olacak xargsve ayrıca wcçok sayıda dosyanız varsa , birden fazla çağrıyı da izlemeniz gerekir; Tüm totalsatırları aramanız ve toplamalısınız.
Stephen Kitt,

Sadece toplam satır sayımı istiyorsanız, yapmanız gerekenfind . -name \*.[ch] -print0 | xargs -0 cat | wc -l
kabarık

Unutmayın ki bu ( find . -name \*.[ch] -print | wc -l) dosya sayısını sayar (bir dosya adı yeni satır içermiyorsa - ama bu çok sıra dışı) - dosyadaki satır sayısını saymaz.
Jonathan Leffler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.