Verwenden Sie Find, WC und SED, um Linien zu zählen
Frage
Ich habe versucht, SED zu verwenden, um alle Linien basierend auf einer bestimmten Erweiterung zu zählen.
find -name '*.m' -exec wc -l {} \; | sed ...
Ich habe versucht, Folgendes zu tun, wie würde ich SED in diese bestimmte Linie einbeziehen, um die Summen zu erhalten.
Lösung
Sie können auch die schöne Formatierung von WC erhalten mit:
wc `find -name '*.m'`
Andere Tipps
Die meisten Antworten hier funktionieren nicht gut für eine große Anzahl von Dateien. Einige werden brechen, wenn die Liste der Dateinamen für einen einzigen Befehlszeilenaufruf zu lang ist, andere sind ineffizient, weil -exec
Startet einen neuen Prozess für jede Datei. Ich glaube, eine robuste und effiziente Lösung wäre:
find . -type f -name "*.m" -print0 | xargs -0 cat | wc -l
Verwendung cat
auf diese Weise ist in Ordnung, da seine Ausgabe direkt in die Ausgabe eingeleitet wird wc
Daher wird also nur eine kleine Menge des Inhalts der Dateien gleichzeitig im Speicher gehalten. Wenn es zu viele Dateien für einen einzigen Aufruf von gibt cat
, cat
wird mehrmals aufgerufen, aber die gesamte Ausgabe wird weiterhin zu einem einzigen geleitet wc
Prozess.
Du kannst cat
Alle Dateien über eine einzelne wc
Instanz, um die Gesamtzahl der Zeilen zu erhalten:
find . -name '*.m' -exec cat {} \; | wc -l
Auf modernen GNU -Plattformen WC und Find Take -print0- und -files0 -FROM -Parameter, die zu einem Befehl kombiniert werden können, der am Ende Zeilen in Dateien mit insgesamt insgesamt zählt. Beispiel:
find . -name '*.c' -type f -print0 | wc -l --files0-from=-
Sie könnten SED auch für die Zählung von Linien anstelle von WC verwenden:
find . -name '*.m' -exec sed -n '$=' {} \;
wo '$='
ist eine "besondere Variable", die die Anzahl der Linien hält
BEARBEITEN
Sie könnten auch so etwas versuchen wie Sloccount
Hm, Lösung mit Katze Kann problematisch sein, wenn Sie viele Dateien haben, insbesondere große.
Die zweite Lösung ergibt keine Gesamtzahl, nur Zeilen pro Datei, wie ich getestet habe.
Ich werde so etwas bevorzugen:
find . -name '*.m' | xargs wc -l | tail -1
Dies erledigt den Job schnell, egal wie viele und große Dateien Sie haben.
SED ist nicht das richtige Werkzeug zum Zählen. Verwenden Sie stattdessen awk:
find . -name '*.m' -exec awk '{print NR}' {} +
Verwenden von + statt ; Kräfte finden, um awk zu rufen, um alle gefundenen N -Dateien (wie bei Xargs) aufzurufen.
Für große Verzeichnisse sollten wir verwenden:
find . -type f -name '*.m' -exec sed -n '$=' '{}' + 2>/dev/null | awk '{ total+=$1 }END{print total}'
# alternative using awk twice
find . -type f -name '*.m' -exec awk 'END {print NR}' '{}' + 2>/dev/null | awk '{ total+=$1 }END{print total}'