2057 Stimmen

Wie kann ich alle Codezeilen in einem Verzeichnis rekursiv zählen?

Wir haben eine PHP-Anwendung und wollen alle Codezeilen in einem bestimmten Verzeichnis und seinen Unterverzeichnissen zählen.

Wir brauchen die Kommentare nicht zu ignorieren, da wir nur versuchen, uns einen groben Überblick zu verschaffen.

wc -l *.php 

Dieser Befehl funktioniert gut für ein bestimmtes Verzeichnis, aber er ignoriert Unterverzeichnisse. Ich dachte, der folgende Kommentar könnte funktionieren, aber er gibt 74 zurück, was definitiv nicht der Fall ist...

find . -name '*.php' | wc -l

Wie lautet die korrekte Syntax, um alle Dateien eines Verzeichnisses resursiv einzugeben?

52voto

Paweł Polewicz Punkte 3591

Sie haben nicht angegeben, wie viele Dateien vorhanden sind oder was die gewünschte Ausgabe ist.

Dies könnte das sein, wonach Sie suchen:

find . -name '*.php' | xargs wc -l

5 Stimmen

Dies funktioniert, solange es nicht zu viele Dateien gibt: wenn es viele Dateien gibt, erhalten Sie mehrere Zeilen als Ergebnis (xargs teilt die Dateiliste in mehrere Unterlisten auf)

0 Stimmen

Ah, ja. Deshalb habe ich gesagt, dass er nicht angegeben hat, wie viele Dateien vorhanden sind. Meine Version ist leichter zu merken, aber Shins Version ist besser, wenn Sie mehr als ein paar Dateien haben. Ich stimme für sie.

0 Stimmen

Ich musste dies für die Verwendung in einer Funktion anpassen, wo einfache Anführungszeichen zu restriktiv sind: 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/* . } Die Ergebnisse lagen nahe an der Slocount-Zahl für *.py aber sie wusste es nicht *.js , *.html .

43voto

Motiejus Jakštys Punkte 2519

Eine weitere Variante :)

$ find . -name '*.php' | xargs cat | wc -l

Dadurch erhält man die Gesamtsumme, anstatt Datei für Datei.

hinzufügen . nach find damit es funktioniert.

0 Stimmen

Zumindest in Cygwin hatte ich bessere Ergebnisse mit: $ find -name \*\.php -print0 | xargs -0 cat | wc -l

0 Stimmen

Auf Darwin, das ergibt einfach eine Gesamtsumme: find . -name '*.php' | xargs cat | wc -l ... wohingegen dies eine Datei nach der anderen und eine Gesamtsumme anzeigt: find . -name '*.php' | xargs wc -l

35voto

jonhattan Punkte 483

Verwenden Sie finden. 's -exec y awk . Jetzt geht's los:

find . -type f -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }'

Dieses Snippet sucht nach allen Dateien ( -type f ). Um nach der Dateierweiterung zu suchen, verwenden Sie -name :

find . -name '*.py' -exec wc -l '{}' \; | awk '{ SUM += $0; } END { print SUM; }'

2 Stimmen

Funktionell funktioniert das perfekt, aber bei großen Verzeichnissen (Linux-Quellcode) ist es wirklich langsam, weil es für jede Datei einen wc-Prozess startet, anstatt einen wc-Prozess für alle Dateien. Ich habe 31 Sekunden mit dieser Methode gemessen, verglichen mit 1,5 Sekunden mit find . -name '*.c' -print0 |xargs -0 wc -l . Das heißt, dass diese schnellere Methode (zumindest unter OS X) dazu führt, dass "total" mehrmals gedruckt wird, so dass eine zusätzliche Filterung erforderlich ist, um eine korrekte Summe zu erhalten (ich habe Details in meiner Antwort angegeben).

0 Stimmen

Dies hat den Vorteil, dass es für eine unbegrenzte Anzahl von Dateien funktioniert. Gut gemacht!

1 Stimmen

Dies ist die weitaus bessere Lösung, wenn man mit einer großen Menge an GB und Dateien arbeitet. wc auf einer Form eines cat ist langsam, weil das System erst alle GB verarbeiten muss, um mit dem Zählen der Zeilen zu beginnen (getestet mit 200 GB jsons, 12k Dateien). wc und dann das Ergebnis zu zählen, ist viel schneller

34voto

Joel Ellis Punkte 1094

Das Werkzeug Tokei zeigt Statistiken über den Code in einem Verzeichnis an. Tokei zeigt die Anzahl der Dateien, die Gesamtanzahl der Zeilen in diesen Dateien sowie Code, Kommentare und Leerzeichen gruppiert nach Sprache an. Tokei ist auch auf Mac, Linux und Windows verfügbar.

Ein Beispiel für die Ausgabe von Tokei lautet wie folgt:

$ tokei
-------------------------------------------------------------------------------
 Language            Files        Lines         Code     Comments       Blanks
-------------------------------------------------------------------------------
 CSS                     2           12           12            0            0
 JavaScript              1          435          404            0           31
 JSON                    3          178          178            0            0
 Markdown                1            9            9            0            0
 Rust                   10          408          259           84           65
 TOML                    3           69           41           17           11
 YAML                    1           30           25            0            5
-------------------------------------------------------------------------------
 Total                  21         1141          928          101          112
-------------------------------------------------------------------------------

Tokei kann wie folgt installiert werden die Anweisungen in der README-Datei im Repository .

1 Stimmen

Tolles Werkzeug, danke.

28voto

sergeych Punkte 783

Häufiger und einfacher als für mich, nehmen Sie an, Sie müssen Dateien mit unterschiedlichen Namenserweiterungen zählen (sagen wir, auch Eingeborene):

wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )

6 Stimmen

Dies bewirkt nicht ganz das, was Sie denken. find . -Name ' .[am]' ist identisch mit find . -Name ' .[a|m]' findet alle Dateien, die mit .m oder .a enden

1 Stimmen

Aber die zweite findet auch Dateien, die auf .| enden, falls vorhanden. Also ist [h|c|cpp|php|cc] am Ende das Gleiche wie [hcp|] .

0 Stimmen

Backticks sind veraltet, bevorzugen $()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X