Anzeige:
Ergebnis 1 bis 13 von 13

Thema: Für Experten und Gurus :-)

  1. #1
    bjo
    Gast

    Lightbulb Für Experten und Gurus :-)

    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
    Code:
    cat * | wc -l
    funktioniert somit leider nicht.

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

    BJO

  2. #2
    Registrierter Benutzer
    Registriert seit
    12.11.2004
    Beiträge
    35
    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

  3. #3
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Also ich hätte unter dem Titel was anderes erwartet.

    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  4. #4
    bjo
    Gast
    @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

  5. #5
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von bjo Beitrag anzeigen
    Das sloccount ist für diesen Fall einfach viel zu Overpowert!
    Normalerweise zählt man Zeilen(ohne Kommentare) und nicht Wörter...

    MfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  6. #6
    bjo
    Gast
    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

  7. #7
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Yep - war wegen wc ...

    Sorry, mfG Bischi

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  8. #8
    Registrierter Benutzer
    Registriert seit
    12.11.2004
    Beiträge
    35
    Zitat Zitat von bjo Beitrag anzeigen
    @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

  9. #9
    Registrierter Benutzer
    Registriert seit
    09.04.2003
    Beiträge
    17
    find . -type f -exec cat {} \;|wc -l

  10. #10
    Registrierter Benutzer
    Registriert seit
    22.08.2002
    Ort
    Nürnberg
    Beiträge
    638
    Schaust Du hier, hast Du Antwort: http://en.wikipedia.org/wiki/Linux_kernel#Timeline

    Pingu
    Homepage: www.pingu.info

  11. #11
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von Jinto Beitrag anzeigen
    find . -type f -exec cat {} \;|wc -l
    Besser:
    Code:
    find . -type -f -exec wc -l {} \;

  12. #12
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von Pingu Beitrag anzeigen
    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

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  13. #13
    Registrierter Benutzer
    Registriert seit
    05.09.2002
    Ort
    Neuhausen
    Beiträge
    320
    Zitat Zitat von Joghurt Beitrag anzeigen
    Besser:
    Code:
    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:
    Code:
    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.
    Zitat Zitat von bjo
    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:
    Code:
    find . -type f -print0 | xargs -0 -n 1000 wc -l
    Und hier ist dann auch gleich der nächste Fehler zu finden
    Zitat Zitat von bjo
    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

    Zum Abschluss also noch der gesammte, optimierte Befehl:
    Code:
    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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •