PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Für Experten und Gurus :-)



bjo
25-08-2006, 16:27
Hallo,

ich muß für eine Arbeit den Sourcecode von Linux zählen. ALso ab Version 2.0 bis zur aktuellsten 2.6.17.11 jeweils die Anzahl von Codezeilen. Dazu habe ich mir mal alle Quellen heruntergeladen und stehe jetzt vor dem Problem mittels Shell-Befehlen die Anzahl der Zeilen des Codes zu berechnen.

Dacht mir das müsste eigentlich mit cat, "|", "wc -l" gehen, aber das Problem ist das ich auch alle Unterverzeichnisse mit einschliessen muß.
Ein einfaches
cat * | wc -l funktioniert somit leider nicht.

Darum meine Frage. Hat ein Skriptexperte dafür eine Idee? :o

BJO

coolpix
25-08-2006, 18:49
Hi,

mal so auf die Schnelle würde ich folgendes vorschlagen:


find . -name \* -print0 | xargs -0 wc -l

Der Punkt steht für das aktuelle Verzeichnis ;)

mfG

peschmae
25-08-2006, 20:39
Also ich hätte unter dem Titel was anderes erwartet. :p

Guck mal sloccount an. Ist ein Programm dass u.A. Codezeilen zählt (und denke ich jetzt mal auch Kommentare weglässt, etc)

MfG Peschmä

bjo
26-08-2006, 09:58
@coolpix: Gute Idee, allerdings stimmt das Ergebnis nicht. Die SHell meckerte zuerst über eine zu lange Argumentzeile. Nach dem Entfernen von -0 als xargs-Option liefs dann, allerdings mit ca. 400000 Codezeilen für den aktuellen Linux-Kernel. Das ist ca. um den Faktor 10 zu wenig :-)

@peschmae
Zwar kein Skript, aber das Programm funktioniert tadellos. Dachte nur ... diese "einfache" Aufgabe sollte mit simplen Batch-Befehlen doch lösbar sein. Das sloccount ist für diesen Fall einfach viel zu Overpowert! (was für ein Wort!)

Danke euch
BJO

bischi
26-08-2006, 14:59
Das sloccount ist für diesen Fall einfach viel zu Overpowert!

Normalerweise zählt man Zeilen(ohne Kommentare) und nicht Wörter...

MfG Bischi

bjo
26-08-2006, 22:47
Normalerweise zählt man Zeilen(ohne Kommentare) und nicht Wörter...

Aehhh hab ich etwas von Wörtern geschrieben? Ups ... *Oben nachschau ... *nichts find von Wörtern ... hmmm .. meinst du wegen dem Befehl wc? Heisst zwar Word Count, liefert allerdings mit der Option -l ausgeführt die Anzahl an Zeilen. :-)

BJO

bischi
27-08-2006, 00:09
Yep - war wegen wc ...

Sorry, mfG Bischi

coolpix
27-08-2006, 01:16
@coolpix: Gute Idee, allerdings stimmt das Ergebnis nicht. Die SHell meckerte zuerst über eine zu lange Argumentzeile. Nach dem Entfernen von -0 als xargs-Option liefs dann, allerdings mit ca. 400000 Codezeilen für den aktuellen Linux-Kernel. Das ist ca. um den Faktor 10 zu wenig :-)

Hi nochmal,

also bei mir klappt es, aber deine Argumentliste ist wohl einfach zu lang. Die -0 bei xargs ist noetig, denn die Option bei find -print0 trennt die Dateinamen mit einer binären Null, ohne klappt es (ueberhaupt) nicht. Gibt wohl elegantere Lösungen, auch ohne sloccount ;-).

mfG

Jinto
29-08-2006, 01:16
find . -type f -exec cat {} \;|wc -l

Pingu
29-08-2006, 06:39
Schaust Du hier, hast Du Antwort: http://en.wikipedia.org/wiki/Linux_kernel#Timeline

Pingu

Joghurt
29-08-2006, 13:58
find . -type f -exec cat {} \;|wc -lBesser:
find . -type -f -exec wc -l {} \;

bischi
29-08-2006, 16:27
Schaust Du hier, hast Du Antwort: http://en.wikipedia.org/wiki/Linux_kernel#Timeline

Aber Wikipedia vertraut man doch nicht, wenn man eine eigene Arbeit schreibt - das prüft man selbstverständlich nach ;)

MfG Bischi

RapidMax
04-09-2006, 21:36
Besser:
find . -type -f -exec wc -l {} \;
Optimieren wir weiter: Bei dem oben aufgeführten Befehl, wird für jede Datei ein neuer wc-Prozess gestartet. Beim folgenden Befehl jedoch nicht:

find . -type f -print0 | xargs -0 wc -l
Hier werden nur so viele Prozesse gestartet, wie es die maximale Länge der Kommandozeile zulässt.

Die SHell meckerte zuerst über eine zu lange Argumentzeile.
xargs sollte darauf achten, dass die Argument-Länge nicht überschritten wird. Tut es das nicht, kann man das mit dem xargs-Parameter -n N beeinflussen:

find . -type f -print0 | xargs -0 -n 1000 wc -l
Und hier ist dann auch gleich der nächste Fehler zu finden

allerdings mit ca. 400000 Codezeilen für den aktuellen Linux-Kernel. Das ist ca. um den Faktor 10 zu wenig :-)
Jedesmal wenn ein neuer wc-Prozess von xargs gestartet wird, gibt dieser sein Total aus. Es wurden allso durchaus mehr als 400000 gezählt, du hast sie nur nicht gesehen :D

Zum Abschluss also noch der gesammte, optimierte Befehl:

find -type f -print0 | xargs -0 wc -l | awk '/^ *[0-9]+ +insgesamt/{tot += $1} END {print tot}'
Allerdings bin ich damit immernoch nicht ganz glücklich, da hier alles gezählt wird, was Zeilen hat. Interessanter ist es das auf bestimmte dateien zu begrenzen, zum Beispiel indem man find um die Option "-name "*.[ch]" ergänzt und so nur C-Source berücksichtigt.

Ich empfehle dir auch sloccount zu verwenden. Neben der "rohen" Zeilenanzahl von wc kann dieses etwas aussagekräftigere Werte liefern.

Gruss, Andy