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?

11voto

Gene Punkte 44687

Keine der bisherigen Antworten geht auf das Problem der Dateinamen mit Leerzeichen ein.

Außerdem werden alle, die xargs scheitern, wenn die Gesamtlänge der Pfade im Baum die Größenbeschränkung der Shell-Umgebung übersteigt (unter Linux liegt die Standardeinstellung bei einigen Megabyte).

Hier ist eine, die diese Probleme auf ziemlich direkte Weise behebt. Die Subshell kümmert sich um Dateien mit Leerzeichen. Die awk summiert den Strom der einzelnen Dateien wc Ausgänge, so dass der Speicherplatz nie erschöpft sein dürfte. Außerdem schränkt es die exec nur für Dateien (Verzeichnisse werden übersprungen):

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

0 Stimmen

Das ist eine ehrliche Frage. Wenn man in der Lage ist, solche Dinge in kürzerer Zeit selbst zu erledigen, als man braucht, um jemand anderen SO zu beauftragen, ist das definitiv eine Fähigkeit, die jemand haben sollte, der Software-Ingenieur werden will. Ich bin nicht herablassend. Wenn Sie das selbst herausfinden, sind Sie schon weiter.

9voto

Ja͢ck Punkte 165747

Ich weiß, dass die Frage wie folgt gekennzeichnet ist bash aber es scheint, dass das Problem, das Sie zu lösen versuchen, auch mit PHP zusammenhängt.

Sebastian Bergmann schrieb ein Tool namens PHPLOC die das tut, was Sie wollen, und Ihnen darüber hinaus einen Überblick über die Komplexität eines Projekts verschafft. Dies ist ein Beispiel für einen solchen 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 können, sind die bereitgestellten Informationen aus der Sicht eines Entwicklers sehr viel nützlicher, da sie Ihnen grob sagen können, wie komplex ein Projekt ist, bevor Sie mit der Arbeit daran beginnen.

9voto

alexis Punkte 46051

Wenn Sie es einfach halten wollen, lassen Sie den Mittelsmann weg und rufen Sie einfach an wc mit allen Dateinamen:

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

Oder in der modernen Syntax:

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

Dies funktioniert, solange keine Leerzeichen in den Verzeichnis- oder Dateinamen enthalten sind. Und solange Sie nicht Zehntausende von Dateien haben (moderne Shells unterstützen sehr lange Befehlszeilen). Ihr Projekt hat 74 Dateien, Sie haben also noch viel Platz zum Wachsen.

0 Stimmen

Das gefällt mir! Wenn Sie in einer hybriden C/C++-Umgebung arbeiten: wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`

7voto

Znik Punkte 900

WC -L ? besser GREP -C ^ verwenden

wc -l ? Falsch!

El wc Befehl zählt neue Zeilencodes, no Zeilen! Wenn die letzte Zeile in der Datei nicht mit einem neuen Zeilencode endet, dies wird nicht gezählt!

Wenn Sie trotzdem Zeilen zählen wollen, 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 of '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 schließlich auf die wc -l Falle (zählt Eingaben, nicht Zeilen!!!)

0 Stimmen

Bitte lesen Sie die POSIX-Definition einer Zeile . Mit grep -c ^ Sie zählen die Anzahl der unvollständige Zeilen und solche unvollständigen Zeilen können nicht in einer Textdatei .

2 Stimmen

Ich weiß es. In der Praxis kann nur die letzte Zeile unvollständig sein, weil sie kein EOL hat. Die Idee ist, alle Zeilen zu zählen, auch die unvollständigen. Es ist ein sehr häufiger Fehler, nur vollständige Zeilen zu zählen. Nach dem Zählen denken wir "warum habe ich die letzte Zeile übersehen???". Dies ist die Antwort auf die Frage, warum, und ein Rezept, wie man es richtig macht.

0 Stimmen

Oder, wenn Sie einen Einzeiler wollen: find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc Siehe hier für Alternativen zu bc : stackoverflow.com/q/926069/2400328

5voto

walv Punkte 2443

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

0 Stimmen

Es ist ziemlich unwahrscheinlich, dass OP unter Windows arbeitet, wenn er die Bash verwendet.

1 Stimmen

@VanessaMcHale Sowohl der Titel der Frage als auch die Beschreibung verlangen nicht eindeutig nach einer reinen 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.

0 Stimmen

Dieser Kommentar hat mir geholfen. Ich habe das ausprobiert und es funktioniert gut.

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