bash - www - windows count number of lines in a directory




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

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 ungefähre Vorstellung zu bekommen.

wc -l *.php 

Dieser Befehl funktioniert in einem bestimmten Verzeichnis sehr gut, 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

Wie lautet die korrekte Syntax zum Eingeben aller Dateien?


WC -L? verwende besser GREP -C ^

WC -l? Falsch! Der wc-Befehl 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

endlich aufpassen auf die wc-ll-falle (counts dringt ein, nicht linien !!!)


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

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

Dieser Snippet findet für alle Dateien ( -type f ). Um nach der Dateierweiterung zu suchen, verwenden Sie -name :

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

Eine einfache, die schnell sein wird, wird die gesamte Such- / Filterkraft von find , nicht fehlschlagen, wenn zu viele Dateien vorhanden sind (Zahlargumente überlaufen), funktionieren gut mit Dateien mit witzigen Symbolen in ihrem Namen, ohne xargs , nicht starten Sie eine unnötig hohe Anzahl von externen Befehlen (dank + für find 's -exec ). Bitte schön:

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

Es gibt ein kleines Tool namens slocount, um die Codezeilen im Verzeichnis zu zählen. Es sollte beachtet werden, dass es mehr als Sie wollen, da es leere Zeilen / Kommentare ignoriert, die Ergebnisse pro Programmiersprache gruppiert und einige Statistiken berechnet.


Für Windows ist das einfache und schnelle Tool LocMetrics .


Für einen anderen Einliner:

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

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


Ich habe beschäftigt Box auf meinem Windows-System installiert. Also hier ist was ich getan habe.

ECHO OFF
for /r %%G in (*.php) do (
busybox grep . "%%G" | busybox wc -l
) 

Ich habe dieses Inline-Skript benutzt, das ich aus dem Verzeichnis von src-project gestartet habe:

 for i in $(find . -type f); do rowline=$(wc -l $i | cut -f1 -d" "); file=$(wc -l $i | cut -f2 -d" "); lines=$((lines + rowline)); echo "Lines["$lines"] " $file "has "$rowline"rows."; done && unset lines

Das erzeugt diese Ausgabe:

Lines[75]  ./Db.h has 75rows.
Lines[143]  ./Db.cpp has 68rows.
Lines[170]  ./main.cpp has 27rows.
Lines[294]  ./Sqlite.cpp has 124rows.
Lines[349]  ./Sqlite.h has 55rows.
Lines[445]  ./Table.cpp has 96rows.
Lines[480]  ./DbError.cpp has 35rows.
Lines[521]  ./DbError.h has 41rows.
Lines[627]  ./QueryResult.cpp has 106rows.
Lines[717]  ./QueryResult.h has 90rows.
Lines[828]  ./Table.h has 111rows.

Noch ein Befehl, um die Summe aller Dateien zu erhalten (Linux natürlich)

find ./ -type f -exec wc -l {}  \; | cut -d' ' -f1 | paste -sd+ | bc

Hauptunterschied zu anderen Antworten:

  1. Verwenden von find -exec ,
  2. mit Paste (mit Schnitt) ,
  3. mit bc

Noch eine Variante :)

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

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


Sie haben nicht angegeben, wie viele Dateien vorhanden sind oder was die gewünschte Ausgabe ist. Suchst du danach:

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


Unter OS X mindestens die Drucke "find + xarg + wc", die in einigen der anderen Antworten aufgelistet sind, "total" mehrmals bei großen Auflistungen, und es wird keine vollständige Summe angegeben. Ich konnte mit dem folgenden Befehl eine einzige Summe für .c-Dateien abrufen:

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


Vermutung, dass niemand dies jemals auf der Rückseite begraben sehen wird ... Doch bisher gibt es keine der Antworten auf das Problem von Dateinamen mit Leerzeichen. Darüber hinaus können alle, die xargs , fehlschlagen, wenn die Gesamtlänge der Pfade im Baum die Größenbeschränkung der Shell-Umgebung überschreitet (bei Linux standardmäßig auf einige Megabyte). Hier ist eine, die diese Probleme in einer ziemlich direkten Weise behebt. Die Subshell kümmert sich um Dateien mit Leerzeichen. Das awk summiert den Strom der einzelnen Datei- wc Ausgaben, so sollte niemals der Speicherplatz knapp werden. Es beschränkt auch die exec auf Dateien (überspringt Verzeichnisse):

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

Wenn Sie Ihre Ergebnisse nach Anzahl der Zeilen sortieren möchten, fügen Sie einfach | sort | sort oder | sort -r | sort -r ( -r für absteigende Reihenfolge) zur ersten Antwort, so:

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

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

wc -l **/*.php

In der Bash-Shell muss dazu die globstar Option gesetzt werden, sonst ist der ** glob-Operator nicht rekursiv. Setzen Sie das Problem um, um diese Einstellung zu aktivieren

shopt -s globstar

Um dies dauerhaft zu machen, fügen Sie es zu einer der Initialisierungsdateien hinzu ( ~/.bashrc , ~/.bash_profile usw.).


Zuerst die längsten Dateien ausgeben (dh vielleicht brauchen diese langen Dateien etwas Refactoring-Liebe?) Und einige Herstellerverzeichnisse ausschließen:

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

nur für Quellen:

wc `find`

um zu filtern, benutze einfach grep

wc `find | grep .php$`

während ich die Scripts mag, bevorzuge ich diese, da es auch eine pro-Datei-Zusammenfassung so lange wie eine Gesamtmenge zeigt

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

Versuchen:

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

Das SLOCCount-Tool kann ebenfalls hilfreich sein.

Es gibt eine genaue Anzahl an Codezeilen für jede Hierarchie, auf die Sie es richten, sowie einige zusätzliche Statistiken.





shell