
Die Aufgabe bestand darin, die Anzahl der Vorkommen des Zeichens „a“ in allen Dateien im Verzeichnis (rekursiv) zu ermitteln.
Mein Skript war das hier
find . -type f -exec grep -o 'a' {} \; 2>/dev/null | wc -l
aber es schlug fehl: Ich bekam das Ergebnis 0, obwohl es auf meinem lokalen Computer funktionierte.
Was ist falsch an diesem Skript? Ich schätze, es ist nicht kugelsicher oder so. Wie kann ich es kugelsicher oder richtig machen?
Antwort1
Ich vermute, dass die problematische Maschine grep
-o nicht unterstützt.
find
Wenn dies der Fall ist, generiert Ihre Befehlszeile bei jedem Ausführen von execs eine Fehlermeldung grep
. Wenn die Standardfehlerausgabe jedoch auf /dev/null umgeleitet wird, stoßen diese Schreie auf taube Ohren.
wc
empfängt kein einziges Byte, was zu einer Zeilenanzahl von 0 führt, da grep
sofort beendet wird.
Versuchen Sie, Ihre Pipeline ohne eine stderr-Umleitung oder mit der Umleitung zu einer Protokolldatei auszuführen. Wenn ich richtig liege, sollten Sie eine Fehlermeldung pro gefundener Datei sehen find
.
Falls Sie es nützlich finden, hier ist eine Alternative, die kein verwendet grep
:
find . -type f -exec cat {} \; | tr -cd a | wc -m
Wenn Sie find
die effizientere +
Exec-Alternative unterstützen:
find . -type f -exec cat {} + | tr -cd a | wc -m
Antwort2
Ich tat dies:
find "${directory-.}" -type f -print0 | xargs -0 -r cat | grep -F -o 'a' | wc -l
was so ziemlich dasselbe ist wie Ihr Befehl und ein Ergebnis ungleich Null lieferte. Sind Sie in dem Verzeichnis, in dem Sie dachten, Sie wären? Und suchen Sie tatsächlich nach a
? Wenn nicht, schlage ich vor grep -F
(wie ich es verwendet habe) oder fgrep
, um nach einer festen Zeichenfolge statt einem regulären Ausdruck zu suchen.
Sie können es mit grep -r
(rekursives grep) weiter vereinfachen:
grep -Fro 'a' "${directory-.} | wc -l
Leider ist es nicht möglich, grep
die Zählung durchzuführen, da grep -o -c
Zeilen und nicht Vorkommen gezählt werden - das halte ich für einen Fehler.