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?
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
mehrmals ausgeführt wird.find . -name "*.php" -not -path "./tests*" | xargs wc -l
Für einen anderen Einzeiler:
arbeitet mit Namen mit Leerzeichen, gibt nur eine Zahl aus.
quelle
man find
.. print0 mit xargs -0 ermöglicht es Ihnen, Dateien zu( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
Wenn Sie eine anständige aktuelle Version von Bash (oder ZSH) verwenden, ist dies viel einfacher:
In der Bash-Shell muss hierfür die
globstar
Option festgelegt werden, andernfalls ist der**
Glob-Operator nicht rekursiv. Problem, um diese Einstellung zu aktivierenUm dies dauerhaft zu machen, fügen Sie es zu einem der Initialisierung Dateien (
~/.bashrc
,~/.bash_profile
etc.).quelle
globstar
sein, damit dies funktioniert.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 Sieglobstar
in Bash aktiviert haben . Sie können mit überprüfenshopt globstar
. Um es explizit zu aktivieren, tun Sie diesshopt -s globstar
.ARG_MAX
wenn Sie eine große Anzahl von.php
Dateien haben, da diesewc
nicht integriert ist.find
Leerzeichen enthalten. Dies könnte durch Verwenden vonprint0
und--null
mit den Aufrufenfind
und behoben werdenxargs
.Sie können das
cloc
Dienstprogramm 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:
quelle
cloc
es sich um eine plattformübergreifende Frage handelt, da es sich nur um ein Perl-Skript handelt?Auf UNIX-ähnlichen Systemen gibt es ein Tool namens,
cloc
das Codestatistiken bereitstellt.Ich bin auf ein zufälliges Verzeichnis in unserer Codebasis gestoßen, in dem steht:
quelle
choco install cloc
Sie haben nicht angegeben, wie viele Dateien vorhanden sind oder welche Ausgabe gewünscht wird. Suchst du danach:
quelle
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
.Noch eine Variation :)
Bearbeiten: Dies ergibt die Gesamtsumme anstelle von Datei für Datei.
Edit2: Add
.
nach ,find
um es Arbeitquelle
$ find -name \*\.php -print0 | xargs -0 cat | wc -l
find . -name '*.php' | xargs cat | wc -l
... während dies Datei für Datei und eine Gesamtsummefind . -name '*.php' | xargs wc -l
Überraschenderweise gibt es keine Antwort basierend auf Fund
-exec
undawk
. Auf geht's:Dieses Snippet findet für alle Dateien (
-type f
). Verwenden Sie zum Suchen nach Dateierweiterung-name
:quelle
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).wc
Form von acat
ist 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). dabeiwc
zuerst , dann das Ergebnis zu zählen ist weit schnellerfind . -type f -exec wc -l {} \+
oderfind . -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 verwendentail
:find . -type f -exec wc -l {} \+ | tail -1
oderfind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
Angenommen, Sie müssen Dateien mit unterschiedlichen Namenserweiterungen zählen (z. B. auch Eingeborene).
Vielen Dank für das Feedback, ich habe es korrigiert.
quelle
$()
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:
Zeilen in jeder Datei, sortiert nach Dateipfad
Zeilen in jeder Datei, sortiert nach Anzahl der Zeilen, absteigend
Gesamtzahl der Zeilen in allen Dateien
quelle
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.
quelle
Was Sie wollen, ist eine einfache
for
Schleife:quelle
xargs
?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 nichtfind
, und ergo findet tatsächlich keine der PHP-Dateien in Unterverzeichnissen. Auch das-print
ist redundant, da es in Ermangelung anderer Aktionen impliziert ist.Nur für Quellen:
Zum Filtern verwenden Sie einfach grep
quelle
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 verwendenxargs
, startet a nicht nutzlos hohe Anzahl externer Befehle (danke+
fürfind
's-exec
). Bitte schön:quelle
\;
anstatt dass+
ich es nicht wusste), sollte diese Antwort die richtige sein.Ich weiß, dass die Frage als markiert ist Bash, 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:
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.
quelle
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
xargs
fehlschlagen, 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. Dieawk
Summe ergibt den Stream der einzelnen Dateiausgabenwc
, daher sollte niemals der Speicherplatz ausgehen. Es beschränkt auch nur dieexec
Dateien (Überspringen von Verzeichnissen):quelle
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:
Achten Sie zum Schluss auf die wc-l-Falle ( Anzahl der Eingaben , keine Zeilen !!!)
quelle
grep -c ^
Sie die Anzahl der unvollständigen Zeilen zählen , können solche unvollständigen Zeilen nicht in einer Textdatei angezeigt werden .find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc
bc
Mit zsh globs ist das ganz einfach:
Wenn Sie bash verwenden, müssen Sie nur ein Upgrade durchführen. Es gibt absolut keinen Grund, Bash zu verwenden.
quelle
sehr einfach
quelle
Wenn Sie möchten, dass Ihre Ergebnisse nach Anzahl der Zeilen sortiert werden, können Sie einfach
| sort
oder| sort -r
(-r
in absteigender Reihenfolge) zur ersten Antwort hinzufügen , wie folgt :quelle
xargs wc -l
numerisch ist, müsste man tatsächlichsort -n
oder verwendensort -nr
.Für Windows ist LocMetrics ein einfaches und schnelles Tool .
quelle
Etwas anderes:
Dies funktioniert einwandfrei, aber Sie müssen mindestens eine
*.php
Datei im aktuellen Ordner oder einem seiner Unterordner haben, sonstwc
bleibt sie stehenquelle
Wenn Sie unter Linux arbeiten (und ich nehme an, Sie sind es), empfehle ich mein Tool polyglot . Es ist dramatisch schneller als entweder
sloccount
odercloc
und es ist nützlicher alssloccount
.Sie können es mit aufrufen
oder
Es ist also viel benutzerfreundlicher als ein kompliziertes Bash-Skript.
quelle
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 kann installiert werden, indem Sie den Anweisungen in der README-Datei im Repository folgen .
quelle
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:
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.
quelle
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:
quelle
Wenn Sie es einfach halten möchten, schneiden Sie den Mittelsmann aus und rufen Sie einfach
wc
mit allen Dateinamen an:Oder in der modernen Syntax:
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.
quelle
wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
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
Verwenden Sie den
line
Befehl, um die Anzahl der Dateien und Zeilen im aktuellen Verzeichnis abzurufen (rekursiv).Wenn Sie mehr Details wünschen, verwenden Sie einfach
line -d
.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
quelle
Wenn die Dateien zu viele sind, suchen Sie besser nach der Gesamtzahl der Zeilen.
quelle
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; }'
quelle