Wenn ich die Codezeilen zählen will, ist das Triviale
cat *.c *.h | wc -l
Was aber, wenn ich mehrere Unterverzeichnisse habe?
recursive
source-code
Niklas Rosencrantz
quelle
quelle
cat
?wc -l *.c *.h
macht das gleiche.wc -l *.c *.h | tail -n 1
eine ähnliche Ausgabe erhalten.**
, so dass Sie möglicherweisewc -l **/*.{h,c}
etwas Ähnliches verwendet haben. Beachten Sie, dass in Bash, zumindest diese Option (genanntglobstar
) ist aus der Standardeinstellung. Beachten Sie aber auch, dass in diesem speziellen Fallcloc
oderSLOCCount
eine viel bessere Option ist. (Auchack
kannfind
zum einfachen Auffinden / Auflisten von Quelldateien vorzuziehen sein .)Antworten:
Am einfachsten ist es, das aufgerufene Tool zu verwenden
cloc
. Verwenden Sie es so:Das ist es. :-)
quelle
Verwenden Sie hierfür wahrscheinlich SLOCCount oder cloc . Sie wurden speziell zum Zählen von Quellcodezeilen in einem Projekt entwickelt, unabhängig von der Verzeichnisstruktur usw .; entweder
oder
erstellt ausgehend vom aktuellen Verzeichnis einen Bericht über den gesamten Quellcode.
Wenn Sie verwenden möchten ,
find
undwc
, GNUwc
hat eine schöne--files0-from
Option:(Danke an SnakeDoc für den Cloc-Vorschlag !)
quelle
sloccount /tmp/stackexchange
(das am 17. Mai nach meinem letzten Neustart erneut erstellt wurde) an, dass die geschätzten Kosten für die Entwicklung der gefundenen sh-, perl-, awk- usw. -Dateien 11.029 US-Dollar betragen. und das schließt nicht die Einzeiler ein, die es nie in eine Skriptdatei geschafft haben.cloc
ist auch gut: github.com/AlDanial/clocDa der
wc
Befehl mehrere Argumente annehmen kann, können Sie einfach alle Dateinamen anwc
das+
Argument der-exec
Aktion von GNU übergebenfind
:Alternativ können Sie in
bash
mithilfe der Shell-Optionglobstar
die Verzeichnisse rekursiv durchlaufen:Andere Shells werden standardmäßig rekursiv durchlaufen (z. B.
zsh
) oder haben ähnliche Optionen wieglobstar
zumindest die meisten.quelle
Sie können
find
zusammen mitxargs
und verwendenwc
:quelle
total
Zeilen ausgegeben werden, wenn mehrerewc
s aufgerufen werden.)wc
Problem mit mehreren Befehlen durch Weiterleitenfind
an diewhile read FILENAME; do . . .done
Struktur behoben werden. Und innerhalb der while-Schleife verwendenwc -l
. Der Rest fasst die Gesamtzeilen zu einer Variablen zusammen und zeigt sie an.Wenn Sie sich in einer Umgebung befinden, in der Sie keinen Zugriff auf
cloc
usw. haben, würde ich vorschlagenDurchlauf:
find
Sucht rekursiv nach allen regulären Dateien, deren Name auf.c
oder endet.h
undcat
auf denen sie ausgeführt werden. Die Ausgabe wird durchgeleitet,grep
um alle nicht leeren Zeilen zu zählen (die, die mindestens ein Zeichen ohne Abstand enthalten).quelle
Wie bereits in den Kommentaren erwähnt,
cat file | wc -l
ist dies nicht gleichbedeutend damit,wc -l file
dass ersteres nur eine Zahl ausgibt, während letzteres eine Zahl und den Dateinamen ausgibt. Ebensocat * | wc -l
wird nur eine Zahl ausgegeben, währendwc -l *
für jede Datei eine Informationszeile ausgegeben wird.Lassen Sie uns im Geiste der Einfachheit die tatsächlich gestellte Frage nochmals betrachten:
Erstens können Sie sogar Ihren einfachen Befehl vereinfachen, um:
Und schließlich ist das Äquivalent für viele Unterverzeichnisse:
Dies könnte möglicherweise auf viele Arten verbessert werden, z. B. indem die übereinstimmenden Dateien durch Hinzufügen auf normale Dateien (nicht auf Verzeichnisse) beschränkt werden.
-type f
Der angegebenefind
Befehl ist jedoch das genaue rekursive Äquivalent zucat *.[ch]
.quelle
Probe mit
awk
:quelle
+
anstelle von\;
.wc -l
für Gruppen von Dateien, eher wie derxargs
Fall ist, aber es Griffe odd-Ball - Zeichen (wie Leerzeichen) in Dateinamen ohne entweder zu benötigenxargs
oder den (Nicht-Standard)-print0
und-0
Optionenfind
undxargs
jeweils. Es ist eine kleine Optimierung. Der Nachteil wäre, dass jeder Aufruf vonwc
am Ende eine Gesamtzeilenzahl ausgibt, wenn mehrere Dateien angegeben werden - dasawk
Skript hätte sich damit befasst. Es ist also kein Slam-Dunk, aber sehr oft ist es eine gute Idee ,+
anstelle von\;
with zu verwendenfind
.wc
. Wenn die Anzahl der gefundenen Dateien a priori nicht bekannt ist , besteht das Risiko, dass diese Grenze überschritten wird, oder wird sie irgendwie von find verarbeitet?find
gruppiert die Dateien in Bündel mit praktischer Größe, wobei die Längenbeschränkung für die Argumentliste auf der Plattform nicht überschritten wird, wobei die Umgebung (die sich aus der Länge der Argumentliste ergibt - also die Länge der Argumentliste plus die Länge der Argumentliste) berücksichtigt wird Länge der Umgebung muss kleiner als ein Maximalwert sein). IOW,find
macht den Job richtig, wiexargs
macht der Job richtig.einfacher Befehl:
quelle
total
Zeilen ausgegeben werden, wenn mehrerewc
s aufgerufen werden.)Wenn Sie unter Linux arbeiten, empfehle ich mein eigenes Tool, polyglot . Es ist dramatisch schneller als
cloc
und featureful alssloccount
.Sie sollten auch in der Lage sein, auf BSD aufzubauen, obwohl es keine bereitgestellten Binärdateien gibt.
Sie können es mit aufrufen
quelle
find . -name \*.[ch] -print | xargs -n 1 wc -l
sollte den Trick machen. Auch hier gibt es verschiedene Variationsmöglichkeiten, z. B. die Verwendung von-exec
anstelle der Weiterleitung der Ausgabe anwc
.quelle
find . -name \*.[ch] -print
aber nicht den Inhalt der Dateien, sondern nur die Dateinamen. Also zähle ich stattdessen die Anzahl der Dateien, oder? Benötige ich "Xargs"?xargs
, und Sie müssten auch auf mehrerewc
Aufrufe achten, wenn Sie viele Dateien haben. Sie müssten nach allentotal
Zeilen suchen und sie summieren.find . -name \*.[ch] -print0 | xargs -0 cat | wc -l
find . -name \*.[ch] -print | wc -l
) die Anzahl der Dateien zählt (es sei denn, ein Dateiname enthält eine neue Zeile - dies ist jedoch sehr ungewöhnlich) - es zählt nicht die Anzahl der Zeilen in den Dateien.