Wie werden alle Codezeilen in einem Verzeichnis rekursiv gezählt?

1624

Wir haben eine PHP-Anwendung und möchten alle Codezeilen unter einem bestimmten Verzeichnis und seinen Unterverzeichnissen zählen. Wir müssen Kommentare nicht ignorieren, da wir nur versuchen, eine grobe Vorstellung zu bekommen.

wc -l *.php 

Dieser Befehl funktioniert in einem bestimmten Verzeichnis hervorragend, ignoriert jedoch Unterverzeichnisse. Ich dachte, das könnte funktionieren, aber es gibt 74 zurück, was definitiv nicht der Fall ist ...

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

Was ist die richtige Syntax, um alle Dateien einzugeben?

user77413
quelle

Antworten:

2650

Versuchen:

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

Das SLOCCount-Tool kann ebenfalls hilfreich sein.

Es gibt eine genaue Anzahl der Quellcodezeilen für jede Hierarchie, auf die Sie zeigen, sowie einige zusätzliche Statistiken.

Sortierte Ausgabe:

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

Peter Elespuru
quelle
31
cloc.sourceforge.net könnte als Alternative zu sloccount (mehr Sprachen, aber weniger Informationen) einen Blick wert sein
AsTeR
31
mit Include-Dateien auch:find . -name '*.php' -o -name '*.inc' | xargs wc -l
Rymo
52
Dies wird mehr als eine Zahl drucken, wenn es viele Dateien gibt (weil wcmehrmals ausgeführt wird.
Behandelt
42
@ find . -name "*.php" -not -path "./tests*" | xargs wc -l
Ende
19
Wenn ein Verzeichnisname Leerzeichen enthält ... schlägt der obige Befehl fehl !!
Nitish712
474

Für einen anderen Einzeiler:

( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l

arbeitet mit Namen mit Leerzeichen, gibt nur eine Zahl aus.

Shizzmo
quelle
1
+1 dito ... für immer gesucht ... alle anderen "find" -Befehle gaben nur die Anzahl der tatsächlichen Dateien zurück ... das -print0-Zeug hier hat die tatsächliche Zeilenanzahl für mich !!! Vielen Dank!
Ronedog
3
@ TorbenGundtofte-Bruun - siehe man find.. print0 mit xargs -0 ermöglicht es Ihnen, Dateien zu
bearbeiten,
2
@ TorbenGundtofte-Bruun - auch das -0 in xargs entspricht dem print0, es ist eine Art Codierung / Decodierung, um die Leerzeichen zu behandeln.
Tristan Reid
7
Wenn Sie mehr als einen Namensfilter benötigen, habe ich festgestellt, dass Sie (zumindest mit der MSYSGit-Version von find) zusätzliche Parens benötigen: ( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Zrax
1
@DesignbyAdrian: Journaling hilft bei der Wiederherstellung nach einem Absturz, nicht bei der Geschwindigkeit. Es ist wahrscheinlich, dass Sie aufgrund von Caching oder einer sehr schnellen Festplatte eine gute Leistung sehen.
jmh
398

Wenn Sie eine anständige aktuelle Version von Bash (oder ZSH) verwenden, ist dies viel einfacher:

wc -l **/*.php

In der Bash-Shell muss hierfür die globstarOption festgelegt werden, andernfalls ist der **Glob-Operator nicht rekursiv. Problem, um diese Einstellung zu aktivieren

shopt -s globstar

Um dies dauerhaft zu machen, fügen Sie es zu einem der Initialisierung Dateien ( ~/.bashrc, ~/.bash_profileetc.).

Michael Wild
quelle
7
Ich stimme dem der Einfachheit halber zu, möchte jedoch nur darauf hinweisen, dass die Verzeichnisse nicht rekursiv durchsucht werden, sondern nur die Unterverzeichnisse des aktuellen Verzeichnisses überprüft werden. Dies ist auf SL6.3.
Godric Seer
7
Das hängt von Ihrer Shell und den von Ihnen festgelegten Optionen ab. Bash muss eingestellt globstarsein, damit dies funktioniert.
Michael Wild
2
@PeterSenna, mit dem aktuellen 3.9.8-Kernel-Archiv findet der Befehl wc -l **/*.[ch]insgesamt 15195373 Zeilen. Ich bin mir nicht sicher, ob Sie dies für einen "sehr niedrigen Wert" halten. Auch hier müssen Sie sicherstellen, dass Sie globstarin Bash aktiviert haben . Sie können mit überprüfen shopt globstar. Um es explizit zu aktivieren, tun Sie dies shopt -s globstar.
Michael Wild
5
@MichaelWild Dies ist eine gute Lösung, aber sie läuft immer noch über, ARG_MAXwenn Sie eine große Anzahl von .phpDateien haben, da diese wcnicht integriert ist.
Setzen Sie Monica bitte
1
@AlbertSamuel Nein, Sie müssen die Liste der Dateien vergleichen, die mit beiden Methoden erstellt wurden. Meine Methode hat das Problem, dass sie nicht für eine große Anzahl von Dateien funktioniert, wie von @BroSlow erwähnt. Die akzeptierte Antwort schlägt fehl, wenn die von erzeugten Pfade findLeerzeichen enthalten. Dies könnte durch Verwenden von print0und --nullmit den Aufrufen findund behoben werden xargs.
Michael Wild
363

Sie können das clocDienstprogramm verwenden, das genau für diesen Zweck erstellt wurde. Es gibt jeweils die Anzahl der Zeilen in jeder Sprache sowie die Anzahl der Kommentare usw. an. CLOC ist unter Linux, Mac und Windows verfügbar.

Verwendungs- und Ausgabebeispiel:

$ cloc --exclude-lang=DTD,Lua,make,Python .
    2570 text files.
    2200 unique files.                                          
    8654 files ignored.

http://cloc.sourceforge.net v 1.53  T=8.0 s (202.4 files/s, 99198.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                    1506          77848         212000         366495
CSS                             56           9671          20147          87695
HTML                            51           1409            151           7480
XML                              6           3088           1383           6222
-------------------------------------------------------------------------------
SUM:                          1619          92016         233681         467892
-------------------------------------------------------------------------------
simao
quelle
4
Das ist ein schönes Tool, das gut läuft und am Ende schnell nützliche Statistiken liefert. Liebe es.
Rob Forrest
4
Beachten Sie, dass Sie Unix-Befehle unter Windows mit cygwin (oder anderen ähnlichen Ports / Umgebungen) ausführen können. Für mich ist es eine Notwendigkeit, diese Art von Zugang so nützlich zu haben. Eine Unix-Kommandozeile ist magisch. Ich mag besonders Perl und reguläre Ausdrücke.
Curtis Yallop
CLOC und SLOCCount funktionieren auf Macbooks Mitte 2015 einwandfrei. Beachten Sie, dass ihre Zahlen nahe beieinander liegen, aber für 127k Java Android-Projekte nicht genau gleich sind. Beachten Sie auch, dass das iOS-Äquivalent die doppelte LoC hatte. Daher ist die "Kosten" -Metrik in SLOCCount möglicherweise deaktiviert (oder iOS-Entwickler machen 2x so
viel
2
Würden Sie den Anfang dieser Frage bearbeiten, um zu verdeutlichen, dass cloces sich um eine plattformübergreifende Frage handelt, da es sich nur um ein Perl-Skript handelt?
Kyle Strand
Einfach perfekt, funktioniert natürlich auch in Windows Bash.
Yurisnm
100

Auf UNIX-ähnlichen Systemen gibt es ein Tool namens, clocdas Codestatistiken bereitstellt.

Ich bin auf ein zufälliges Verzeichnis in unserer Codebasis gestoßen, in dem steht:

      59 text files.
      56 unique files.                              
       5 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (108.0 files/s, 50180.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               36           3060           1431          16359
C/C++ Header                    16            689            393           3032
make                             1             17              9             54
Teamcenter def                   1             10              0             36
-------------------------------------------------------------------------------
SUM:                            54           3776           1833          19481
-------------------------------------------------------------------------------
Calmarius
quelle
2
@moose technisch simtao erwähnte es speziell als Lösung für Windows-Benutzer, ganz zu schweigen von Linux oder Unix.
Tim Seguine
5
@moose Table wurde viel später als meine Antwort in seine Antwort eingearbeitet, jetzt sehen die beiden tatsächlich ähnlich aus.
Calmarius
Ich mag das. Cloc ist wirklich ordentlich. Aber was bedeutet dieser Name?
Manoel Vilela
Es ist jetzt auch unter Windows! Angenommen, Sie haben schokoladig :choco install cloc
icc97
35

Sie haben nicht angegeben, wie viele Dateien vorhanden sind oder welche Ausgabe gewünscht wird. Suchst du danach:

find . -name '*.php' | xargs wc -l
Paweł Polewicz
quelle
2
Dies funktioniert, solange nicht zu viele Dateien vorhanden sind: Wenn viele Dateien vorhanden sind, werden mehrere Zeilen angezeigt (xargs teilt die Dateiliste in mehrere Unterlisten auf)
Pascal MARTIN
Ah ja. Deshalb habe ich gesagt, dass er nicht angegeben hat, wie viele Dateien es gibt. Meine Version ist leichter zu merken, aber Shins Version ist besser, wenn Sie mehr als ein paar Dateien haben. Ich stimme ab.
Paweł Polewicz
Ich brauchte diese in einer Funktion zur Verwendung anzupassen, wo einfache Anführungszeichen sind zu restriktiv: Die 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/* . } Ergebnisse waren in der Nähe slocount für *.py, aber es hat nicht wissen *.js, *.html.
Jalanb
31

Noch eine Variation :)

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

Bearbeiten: Dies ergibt die Gesamtsumme anstelle von Datei für Datei.

Edit2: Add .nach , findum es Arbeit

Motiejus Jakštys
quelle
Beide Antworten summieren die Zeilen.
Josh123a123
Zumindest in Cygwin hatte ich bessere Ergebnisse mit:$ find -name \*\.php -print0 | xargs -0 cat | wc -l
Martin Haeberli
auf Darwin ergibt dies nur eine Gesamtsumme: find . -name '*.php' | xargs cat | wc -l... während dies Datei für Datei und eine Gesamtsumme find . -name '*.php' | xargs wc -l
ergibt
30

Überraschenderweise gibt es keine Antwort basierend auf Fund -execund awk. Auf geht's:

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

Dieses Snippet findet für alle Dateien ( -type f). Verwenden Sie zum Suchen nach Dateierweiterung -name:

find . -name '*.py' -exec wc -l '{}' \; | awk '{ SUM += $0; } END { print SUM; }'
jonhattan
quelle
2
Funktionell funktioniert dies perfekt, aber bei großen Auflistungen (Linux-Quelle) ist es sehr langsam, da für jede Datei ein WC-Prozess anstelle von 1 WC-Prozess für alle Dateien gestartet wird. Ich habe es mit dieser Methode auf 31 Sekunden eingestellt, verglichen mit 1,5 Sekunden mit find . -name '*.c' -print0 |xargs -0 wc -l. Diese schnellere Methode (zumindest unter OS X) druckt jedoch mehrmals "total", sodass einige zusätzliche Filter erforderlich sind, um eine korrekte Summe zu erhalten (Details habe ich in meiner Antwort angegeben).
Doug Richardson
Dies hat den Vorteil, dass für eine unbegrenzte Anzahl von Dateien gearbeitet werden kann. Gut gemacht!
Ekscrypto
1
Dies ist eine weitaus bessere Lösung, wenn Sie mit einer großen Menge an GB und Dateien arbeiten. Das Ausführen einer Datei in wcForm von a catist langsam, da das System zuerst alle GB verarbeiten muss, um mit dem Zählen der Zeilen zu beginnen (getestet mit 200 GB JSONS, 12 KB-Dateien). dabei wczuerst , dann das Ergebnis zu zählen ist weit schneller
ulkas
1
@DougRichardson, Sie könnten dies stattdessen in Betracht ziehen: find . -type f -exec wc -l {} \+oder find . -name '*.py' -type f -exec wc -l {} \+ die am Ende der Ausgabe eine Summe druckt. Wenn alles, was Sie interessiert, die Summe ist, dann könnten Sie ein bisschen weiter gehen und verwenden tail: find . -type f -exec wc -l {} \+ | tail -1oderfind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
JamieJag
25

Angenommen, Sie müssen Dateien mit unterschiedlichen Namenserweiterungen zählen (z. B. auch Eingeborene).

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

Vielen Dank für das Feedback, ich habe es korrigiert.

sergeych
quelle
6
das macht nicht ganz das, was du denkst. finden . -name ' . [am]' ist identisch zu finden. -name ' . [a | m]' beide finden alle Dateien, die mit .m oder .a enden
Omry Yadan
1
Die zweite Datei findet jedoch auch Dateien, die auf. | enden , wenn überhaupt. [H | c | cpp | php | cc] ist also dasselbe wie [hcp |].
OsamaBinLogin
Backticks sind veraltet, bevorzugen$()
Sandburg
Dies funktioniert unter Cygwin. Natürlich muss das Laufwerk "C: \" der Cygwin-Konvention folgen, wie zum Beispiel: wc $ (find / cygdrive / c // SomeWindowsFolderj / -type f | egrep "\. (H | c | cpp | php | cc) ")
Christian Gingras
21

POSIX

Im Gegensatz zu den meisten anderen Antworten funktionieren diese auf jedem POSIX-System, für eine beliebige Anzahl von Dateien und mit beliebigen Dateinamen (sofern nicht anders 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

Gesamtzahl der Zeilen in allen Dateien

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

Es gibt ein kleines Tool namens sloccount, um die Codezeilen im Verzeichnis zu zählen. Es sollte beachtet werden, dass es mehr tut, als Sie möchten, da es leere Zeilen / Kommentare ignoriert, die Ergebnisse nach Programmiersprachen gruppiert und einige Statistiken berechnet.

sebasgo
quelle
Für Windows macht LocMetrics den Job
Camille
15

Was Sie wollen, ist eine einfache forSchleife:

total_count=0
for file in $(find . -name *.php -print)
do
    count=$(wc -l $file)
    let total_count+=count
done
echo "$total_count"
ennuikiller
quelle
3
Ist das nicht übertrieben im Vergleich zu den Antworten, die darauf hindeuten xargs?
Nathan Fellman
5
Nein, Nathan. Die xargs-Antworten geben nicht unbedingt die Anzahl als einzelne Zahl aus. Möglicherweise werden nur einige Zwischensummen gedruckt.
Rob Kennedy
3
Was macht dieses Programm, wenn Dateinamen Leerzeichen enthalten? Was ist mit Zeilenumbrüchen? ;-)
Paweł Polewicz
38
Wenn Ihre Dateinamen neue Zeilen enthalten, haben Sie größere Probleme.
Kzqai
2
@ennuikiller Anzahl der Probleme damit, zunächst wird es auf Dateien mit Leerzeichen brechen. Das Festlegen IFS=$'\n'vor der Schleife würde es zumindest für alle außer Dateien mit Zeilenumbrüchen im Namen beheben. Zweitens zitieren Sie nicht '*.php', so dass es von der Shell erweitert wird und nicht find, und ergo findet tatsächlich keine der PHP-Dateien in Unterverzeichnissen. Auch das -printist redundant, da es in Ermangelung anderer Aktionen impliziert ist.
Setzen Sie Monica bitte
12

Nur für Quellen:

wc `find`

Zum Filtern verwenden Sie einfach grep

wc `find | grep .php$`
kekszumquadrat
quelle
11

Eine unkomplizierte Version, die schnell ist, die gesamte Such- / Filterleistung von nutzt find, nicht fehlschlägt, wenn zu viele Dateien vorhanden sind (Überlauf der Zahlenargumente), funktioniert einwandfrei mit Dateien mit lustigen Symbolen im Namen, ohne zu verwenden xargs, startet a nicht nutzlos hohe Anzahl externer Befehle (danke +für find's -exec). Bitte schön:

find . -name '*.php' -type f -exec cat -- {} + | wc -l
gniourf_gniourf
quelle
2
Ich wollte gerade eine Variante davon posten (mit, \;anstatt dass +ich es nicht wusste), sollte diese Antwort die richtige sein.
Mark K Cowan
7

Ich weiß, dass die Frage als markiert ist , aber es scheint, dass das Problem, das Sie lösen möchten, auch mit PHP zusammenhängt.

Sebastian Bergmann hat ein Tool namens PHPLOC geschrieben , das macht, was Sie wollen, und bietet Ihnen darüber hinaus einen Überblick über die Komplexität eines Projekts. Dies ist ein Beispiel für seinen Bericht:

Size
  Lines of Code (LOC)                            29047
  Comment Lines of Code (CLOC)                   14022 (48.27%)
  Non-Comment Lines of Code (NCLOC)              15025 (51.73%)
  Logical Lines of Code (LLOC)                    3484 (11.99%)
    Classes                                       3314 (95.12%)
      Average Class Length                          29
      Average Method Length                          4
    Functions                                      153 (4.39%)
      Average Function Length                        1
    Not in classes or functions                     17 (0.49%)

Complexity
  Cyclomatic Complexity / LLOC                    0.51
  Cyclomatic Complexity / Number of Methods       3.37

Wie Sie sehen, sind die bereitgestellten Informationen aus Sicht eines Entwicklers viel nützlicher, da sie Ihnen ungefähr sagen können, wie komplex ein Projekt ist, bevor Sie mit der Arbeit beginnen.

Jack
quelle
7

Vermutlich wird niemand dies jemals im Hintergrund begraben sehen ... Doch keine der bisherigen Antworten befasst sich mit dem Problem von Dateinamen mit Leerzeichen. Darüber hinaus können alle Verwendungszwecke xargsfehlschlagen, wenn die Gesamtlänge der Pfade im Baum die Größenbeschränkung für die Shell-Umgebung überschreitet (unter Linux standardmäßig einige Megabyte). Hier ist eine, die diese Probleme auf ziemlich direkte Weise behebt. Die Subshell kümmert sich um Dateien mit Leerzeichen. Die awkSumme ergibt den Stream der einzelnen Dateiausgaben wc, daher sollte niemals der Speicherplatz ausgehen. Es beschränkt auch nur die execDateien (Überspringen von Verzeichnissen):

find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}' 
Gen
quelle
6

WC -L? Verwenden Sie besser GREP -C ^

wc -l? Falsch! Der Befehl wc zählt neue Zeilencodes, keine Zeilen! Wenn die letzte Zeile in der Datei nicht mit einem neuen Zeilencode endet, wird dies nicht gezählt!

Wenn Sie weiterhin Zeilen zählen möchten, verwenden Sie grep -c ^ , vollständiges Beispiel:

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another shell
done
echo TOTAL LINES COUNTED:  $total

Achten Sie zum Schluss auf die wc-l-Falle ( Anzahl der Eingaben , keine Zeilen !!!)

Znik
quelle
Bitte lesen Sie die POSIX-Definition einer Zeile . Wenn grep -c ^Sie die Anzahl der unvollständigen Zeilen zählen , können solche unvollständigen Zeilen nicht in einer Textdatei angezeigt werden .
gniourf_gniourf
2
Ich weiß es. In der Praxis kann nur die letzte Zeile unvollständig sein, da sie keine EOL enthält. Idea zählt alle Zeilen einschließlich der unvollständigen. Es ist ein sehr häufiger Fehler, nur vollständige Zeilen zu zählen. Nach dem Zählen denken wir "warum ich die letzte Zeile verpasst habe ???". Dies ist die Antwort auf das Warum und das Rezept, wie es richtig gemacht wird.
Znik
Oder wenn Sie einen Einzeilerfind -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bcbc
wünschen
5

Mit zsh globs ist das ganz einfach:

wc -l ./**/*.php

Wenn Sie bash verwenden, müssen Sie nur ein Upgrade durchführen. Es gibt absolut keinen Grund, Bash zu verwenden.

Glückliches Gesicht
quelle
4

sehr einfach

find /path -type f -name "*.php" | while read FILE
do
    count=$(wc -l < $FILE)
    echo "$FILE has $count lines"
done
Ghostdog74
quelle
1
Es wird fehlschlagen, wenn in einem der Dateinamen ein Leerzeichen oder eine neue Zeile steht
Paweł Polewicz
4

Wenn Sie möchten, dass Ihre Ergebnisse nach Anzahl der Zeilen sortiert werden, können Sie einfach | sortoder | sort -r( -rin absteigender Reihenfolge) zur ersten Antwort hinzufügen , wie folgt :

find . -name '*.php' | xargs wc -l | sort -r
Paul Pettengill
quelle
1
Da die Ausgabe von xargs wc -lnumerisch ist, müsste man tatsächlich sort -noder verwenden sort -nr.
Dustin Ingram
4

Für Windows ist LocMetrics ein einfaches und schnelles Tool .

walv
quelle
Es ist ziemlich unwahrscheinlich, dass OP unter Windows ausgeführt wird, wenn Bash verwendet wird.
1
Der Titel und die Beschreibung der @ VanessaMcHale-Frage erfordern eindeutig keine reine Unix-Lösung. Eine Windows-basierte Lösung ist also akzeptabel. Auch Google hat mich auf diese Seite verwiesen, als ich nach einer ähnlichen Lösung suchte.
Walv
Dieser Kommentar hat mir geholfen. Ich habe es versucht und es funktioniert gut.
Allan F
4

Etwas anderes:

wc -l `tree -if --noreport | grep -e'\.php$'`

Dies funktioniert einwandfrei, aber Sie müssen mindestens eine *.phpDatei im aktuellen Ordner oder einem seiner Unterordner haben, sonst wcbleibt sie stehen

nav
quelle
kann auch überlaufen ARG_MAX
Mark K Cowan
4

Wenn Sie unter Linux arbeiten (und ich nehme an, Sie sind es), empfehle ich mein Tool polyglot . Es ist dramatisch schneller als entweder sloccountoder clocund es ist nützlicher als sloccount.

Sie können es mit aufrufen

poly .

oder

poly

Es ist also viel benutzerfreundlicher als ein kompliziertes Bash-Skript.


quelle
4

Das Tool Tokei zeigt Statistiken zum Code in einem Verzeichnis an. Tokei zeigt die Anzahl der Dateien, die Gesamtzahl der Zeilen in diesen Dateien und den Code, Kommentare und Leerzeichen nach Sprache gruppiert an. Tokei ist auch unter 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 installiert werden, indem Sie den Anweisungen in der README-Datei im Repository folgen .

Joel Ellis
quelle
1
Dies sollte die akzeptierte Antwort sein
Elijas
3

Wenn Sie nur die Gesamtzahl der Zeilen in Ihren PHP-Dateien benötigen, können Sie auch unter Windows einen sehr einfachen einzeiligen Befehl verwenden, wenn Sie GnuWin32 installiert haben. So was:

cat `/gnuwin32/bin/find.exe . -name *.php` | wc -l

Sie müssen angeben, wo genau sich die find.exe befindet. Andernfalls wird die von Windows bereitgestellte FIND.EXE (aus den alten DOS-ähnlichen Befehlen) ausgeführt, da sie wahrscheinlich vor dem GnuWin32 in der Umgebung PATH liegt und unterschiedliche Parameter und Ergebnisse aufweist.

Bitte beachten Sie, dass Sie im obigen Befehl Anführungszeichen und keine einfachen Anführungszeichen verwenden sollten.

Neven Boyanov
quelle
Im obigen Beispiel verwende ich die Bash für Windows anstelle der cmd.exe. Deshalb gibt es Schrägstriche "/" und keine Schrägstriche "\".
Neven Boyanov
3

Geben Sie zuerst die längsten Dateien heraus (dh, diese langen Dateien müssen möglicherweise umgestaltet werden?), Und schließen Sie einige Herstellerverzeichnisse aus:

 find . -name '*.php' | xargs wc -l | sort -nr | egrep -v "libs|tmp|tests|vendor" | less
Matt
quelle
3

Wenn Sie es einfach halten möchten, schneiden Sie den Mittelsmann aus und rufen Sie einfach wcmit allen Dateinamen an:

wc -l `find . -name "*.php"`

Oder in der modernen Syntax:

wc -l $(find . -name "*.php")

Funktioniert, solange in keinem der Verzeichnisnamen oder Dateinamen Leerzeichen vorhanden sind. Und solange Sie nicht über Zehntausende von Dateien verfügen (moderne Shells unterstützen wirklich lange Befehlszeilen). Ihr Projekt verfügt über 74 Dateien, sodass Sie viel Platz zum Wachsen haben.

alexis
quelle
Ich mag diesen! Wenn Sie in einer hybriden C / C ++ - Umgebung sind:wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
Bram
war überrascht, dass es nicht die beste Antwort war
ms4720
3

Sie brauchen nicht all diese komplizierten und schwer zu merkenden Befehle. Sie brauchen nur ein Werkzeug namens Zeilenzähler .

Ein kurzer Überblick

So erhalten Sie das Tool

$ pip install line-counter

Verwenden Sie den lineBefehl, um die Anzahl der Dateien und Zeilen im aktuellen Verzeichnis abzurufen (rekursiv).

$ line
Search in /Users/Morgan/Documents/Example/
file count: 4
line count: 839

Wenn Sie mehr Details wünschen, verwenden Sie einfach line -d.

$ line -d
Search in /Users/Morgan/Documents/Example/
Dir A/file C.c                                             72
Dir A/file D.py                                           268
file A.py                                                 467
file B.c                                                   32
file count: 4
line count: 839

Und das Beste an diesem Tool ist, dass Sie eine .gitignoreähnliche Konfigurationsdatei hinzufügen können. Sie können Regeln einrichten, um auszuwählen oder zu ignorieren, welche Art von Dateien gezählt werden sollen, genau wie in '.gitignore'.

Weitere Beschreibung und Verwendung finden Sie hier: https://github.com/MorganZhang100/line-counter

Morgan Zhang
quelle
3

Wenn die Dateien zu viele sind, suchen Sie besser nach der Gesamtzahl der Zeilen.

find . -name '*.php' | xargs wc -l | grep -i ' total' | awk '{print $1}'
Bharath
quelle
2

Zumindest unter OS X werden die in einigen anderen Antworten aufgeführten Befehle find + xarg + wc mehrmals in großen Listen mit "total" gedruckt, und es wird keine vollständige Summe angegeben. Mit dem folgenden Befehl konnte ich eine einzelne Summe für .c-Dateien abrufen:

find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'

Doug Richardson
quelle