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.

War es hilfreich?

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}' 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top