Zitat von
Joghurt
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 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 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