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?

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


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.


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.).


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
-------------------------------------------------------------------------------

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
-------------------------------------------------------------------------------

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

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


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; }'

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.


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

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.


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"

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$`

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

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.


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}' 

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 !!!)


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.


4

sehr einfach

find /path -type f -name "*.php" | while read FILE
do
    count=$(wc -l < $FILE)
    echo "$FILE has $count lines"
done

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

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 .


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


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.


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 .


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.


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

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.


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


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}'

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; }'

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.