it-swarm.com.de

Codezeilen zählen?

wenn ich die Codezeilen zählen möchte, ist das Triviale

cat *.c *.h | wc -l

Aber was ist, wenn ich mehrere Unterverzeichnisse habe?

25
Niklas

Am einfachsten ist es, das Tool cloc zu verwenden. Verwenden Sie es so:

cloc .

Das ist es. :-)

51
Ho1

Sie sollten wahrscheinlich SLOCCount oder cloc verwenden, da diese speziell zum Zählen von Quellcodezeilen in einem Projekt entwickelt wurden, unabhängig von der Verzeichnisstruktur usw.; entweder

sloccount .

oder

cloc .

erstellt ab dem aktuellen Verzeichnis einen Bericht über den gesamten Quellcode.

Wenn Sie find und wc verwenden möchten, hat GNU wc ein Nice --files0-from Möglichkeit:

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

(Danke an SnakeDoc für den Cloc-Vorschlag !)

40
Stephen Kitt

Da der Befehl wc mehrere Argumente annehmen kann, können Sie einfach alle Dateinamen an wc übergeben, indem Sie das Argument + Der Aktion -exec Von GNU find:

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

Alternativ können Sie in bash die Shell-Option globstar verwenden, um die Verzeichnisse rekursiv zu durchlaufen:

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

Andere Shells durchlaufen standardmäßig rekursiv (z. B. zsh) oder haben eine ähnliche Option wie globstar, zumindest die meisten.

10
heemayl

Wenn Sie sich in einer Umgebung befinden, in der Sie keinen Zugriff auf cloc usw. haben, würde ich vorschlagen

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

Durchlauf: find sucht rekursiv nach allen regulären Dateien, deren Name entweder mit .c Oder .h Endet, und führt cat auf ihnen aus. Die Ausgabe wird durch grep geleitet, um alle nicht leeren Zeilen zu zählen (diejenigen, die mindestens ein Zeichen ohne Abstand enthalten).

5
Kotte

Sie können find zusammen mit xargs und wc verwenden:

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

Wie in den Kommentaren erwähnt, ist cat file | wc -l nicht gleichbedeutend mit wc -l file, Da erstere nur eine Zahl druckt Während letzterer eine Nummer und den Dateinamen druckt. Ebenso druckt cat * | wc -l Nur eine Zahl, während wc -l * Für jede Datei eine Informationszeile druckt.

Lassen Sie uns im Sinne der Einfachheit die tatsächlich gestellte Frage noch einmal betrachten:

wenn ich die Codezeilen zählen möchte, ist das Triviale

cat *.c *.h | wc -l

Aber was ist, wenn ich mehrere Unterverzeichnisse habe?

Erstens können Sie sogar Ihren trivialen Befehl vereinfachen, um:

cat *.[ch] | wc -l

Und schließlich das Äquivalent mit vielen Unterverzeichnissen ist :

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

Dies könnte möglicherweise auf viele Arten verbessert werden, z. B. indem die übereinstimmenden Dateien nur auf reguläre Dateien (keine Verzeichnisse) beschränkt werden, indem -type f Hinzugefügt wird. Der angegebene Befehl find ist jedoch der Befehl genaues rekursives Äquivalent von cat *.[ch].

4
Wildcard

Beispiel mit awk:

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

einfacher Befehl:

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

Wenn Sie unter Linux arbeiten, empfehle ich mein eigenes Tool polyglot . Es ist dramatisch schneller als cloc und funktionsfähiger als sloccount.

Sie sollten auch in der Lage sein, auf BSD aufzubauen, obwohl keine Binärdateien bereitgestellt werden.

Sie können es mit aufrufen

poly .
0
user254560