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?

3voto

Walf Punkte 7428

Ähnlich wie Shizzmo's Antwort , aber hässlicher und genauer. Wenn Sie es häufig verwenden, ändern Sie es entsprechend und fügen Sie es in ein Skript ein.

Dieses Beispiel:

  1. Pfade, die nicht zu Ihrem Code gehören, werden ordnungsgemäß ausgeschlossen (sie werden überhaupt nicht von find )
  2. Filtert zusammengesetzte Erweiterungen und andere Dateien aus, die Sie ignorieren möchten
  3. Enthält nur tatsächliche Dateien der von Ihnen angegebenen Typen
  4. Ignoriert Leerzeilen
  5. Liefert eine einzige Zahl als Gesamtsumme

    find . ! ( ( -path ./lib -o -path ./node_modules -o -path ./vendor -o -path ./any/other/path/to/skip -o -wholename ./not/this/specific/file.php -o -name '.min.js' -o -name '.min.css' ) -prune ) -type f ( -name '.php' -o -name '.inc' -o -name '.js' -o -name '.scss' -o -name '.css' ) -print0 | xargs -0 cat | grep -vcE '^[[:space:]]$'

0 Stimmen

Ist es möglich, dies für alle Textdateien zu tun, nicht nur für solche mit bestimmten Erweiterungen?

0 Stimmen

@AaronFranke Das sollte viel einfacher sein, versuchen Sie es: grep -rvcIE '^[[:space:]]*$' Die r bedeutet rekursive Suche, und das Flag I Flag bedeutet, dass Binärdateien ignoriert werden.

3voto

akiva Punkte 2508

Obwohl ich die Skripte mag, bevorzuge ich dieses, da es auch eine Zusammenfassung pro Datei und eine Gesamtzahl anzeigt:

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

0 Stimmen

Re "...so lange, wie eine totale..." : Meinen Sie nicht "...als auch eine totale..." ?

3voto

Doug Richardson Punkte 9889

Zumindest unter OS X geben die Befehle find+xarg+wc, die in einigen der anderen Antworten aufgeführt sind, bei großen Auflistungen mehrmals "total" aus, und es wird keine vollständige Summe angegeben. Mit dem folgenden Befehl konnte ich eine einzige Gesamtsumme für .c-Dateien ermitteln:

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

0 Stimmen

Anstelle von grep -v total können Sie grep total - die die Zwischensummen summiert, die durch wc . Eine Neuberechnung der Zwischensummen ist nicht sinnvoll, da wc hat es bereits getan.

3voto

Neven Boyanov Punkte 739

Wenn Sie nur die Gesamtzahl der Zeilen in, sagen wir, Ihren PHP-Dateien benötigen, können Sie einen sehr einfachen Ein-Zeilen-Befehl sogar unter Windows verwenden, wenn Sie GnuWin32 installiert haben. Zum Beispiel so:

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

Sie müssen angeben, wo genau sich die Datei find.exe befindet, da sonst die von Windows bereitgestellte FIND.EXE (von den alten DOS-ähnlichen Befehlen) ausgeführt werden, da es wahrscheinlich vor GnuWin32 in der Umgebung PATH steht und andere Parameter und Ergebnisse hat.

Bitte beachten Sie, dass Sie in dem obigen Befehl keine einfachen Anführungszeichen, sondern Anführungszeichen verwenden sollten.

0 Stimmen

Im obigen Beispiel verwende ich die Bash für Windows anstelle der cmd.exe, daher die Schrägstriche "/" und nicht die Schrägstriche "\".

2voto

fyngyrz Punkte 2078

Hier ist eine flexible Lösung, die älteres Python verwendet (funktioniert mindestens in Python 2.6) und Folgendes beinhaltet Shizzmos schöner Einzeiler . Füllen Sie einfach das types Liste mit den Dateitypen, die im Quellordner gezählt werden sollen, und lassen Sie es laufen:

#!/usr/bin/python

import subprocess

rcmd = "( find ./ -name '*.%s' -print0 | xargs -0 cat ) | wc -l"
types = ['c','cpp','h','txt']

sum = 0
for el in types:
    cmd = rcmd % (el)
    p = subprocess.Popen([cmd],stdout=subprocess.PIPE,shell=True)
    out = p.stdout.read().strip()
    print "*.%s: %s" % (el,out)
    sum += int(out)
print "sum: %d" % (sum)

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