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?

25voto

Paul Draper Punkte 70845

POSIX

Im Gegensatz zu den meisten anderen Antworten hier, funktionieren diese auf jedem POSIX-System, für eine beliebige Anzahl von Dateien und mit beliebigen Dateinamen (außer wo angegeben).


Zeilen in jeder Datei:

find . -name '*.php' -type f -exec wc -l {} \;
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} +

Zeilen in jeder Datei, sortiert nach Dateipfad

find . -name '*.php' -type f | sort | xargs -L1 wc -l
# for files with spaces or newlines, use the non-standard sort -z
find . -name '*.php' -type f -print0 | sort -z | xargs -0 -L1 wc -l

Zeilen in jeder Datei, sortiert nach Anzahl der Zeilen, absteigend

find . -name '*.php' -type f -exec wc -l {} \; | sort -nr
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} + | sort -nr

Gesamtanzahl der Zeilen in allen Dateien

find . -name '*.php' -type f -exec cat {} + | wc -l

24voto

sebasgo Punkte 3801

Es gibt ein kleines Tool namens sloccount um die Codezeilen in einem Verzeichnis zu zählen.

Es sollte beachtet werden, dass es mehr tut, als Sie wollen, denn es ignoriert leere Zeilen/Kommentare, gruppiert die Ergebnisse nach Programmiersprachen und berechnet einige Statistiken.

0 Stimmen

Für Windows, LocMetrics die Arbeit erledigen

0 Stimmen

Eine Wiederholung der akzeptierten Antwort (obwohl zur gleichen Zeit veröffentlicht).

15voto

ennuikiller Punkte 44945

Sie möchten eine einfache for Schleife:

total_count=0
for file in $(find . -name *.php -print)
do
    count=$(wc -l $file)
    let total_count+=count
done
echo "$total_count"

3 Stimmen

Ist das nicht übertrieben im Vergleich zu den Antworten, die vorschlagen xargs ?

7 Stimmen

Nein, Nathan. Die xargs-Antworten geben die Anzahl nicht unbedingt als eine einzige Zahl aus. Es kann einfach eine Reihe von Zwischensummen ausgeben.

4 Stimmen

Was macht das Programm, wenn Dateinamen Leerzeichen enthalten? Was ist mit Zeilenumbrüchen? ;-)

13voto

kekszumquadrat Punkte 121

Nur für Quellen:

wc `find`

Um zu filtern, verwenden Sie einfach grep :

wc `find | grep .php$`

12voto

gniourf_gniourf Punkte 41590

Eine unkomplizierte, schnelle Lösung, die die gesamte Such- und Filterleistung von find , schlägt nicht fehl, wenn zu viele Dateien vorhanden sind (Überlauf der Zahlenargumente), funktioniert problemlos mit Dateien mit komischen Symbolen in ihrem Namen, ohne xargs und startet nicht unnötig viele externe Befehle (dank der + para find 's -exec ). Hier ist es:

find . -name '*.php' -type f -exec cat -- {} + | wc -l

2 Stimmen

Ich wollte gerade selbst eine Variante davon veröffentlichen (mit \; anstelle von + da ich sie nicht kannte), sollte diese Antwort die richtige sein.

0 Stimmen

Ich habe ( find . -type f -exec cat {} \; |wc -l ) gemacht, dann habe ich das gesehen. Ich frage mich nur, was '--' und '+' in dieser Lösung bedeuten und was der Unterschied zu meiner Version bezüglich der Anzahl der externen Befehle ist.

0 Stimmen

@grenix: Ihre Version erzeugt eine neue cat für jede gefundene Datei, während die \+ Version gibt alle gefundenen Dateien an cat in einem einzigen Anruf. Die -- dient dazu, das Ende von Optionen zu markieren (hier ist es ein bisschen unnötig).

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