Anzahl der Dateien, die eine bestimmte Zeichenfolge enthalten

18

Wie kann ich die Anzahl der Dateien (in einem Verzeichnis), die eine bestimmte Zeichenfolge enthalten, als Eingabe in bash / sh zählen?

Seestern
quelle

Antworten:

29

grep -l "string" * | wc -l wird nach "string" im Inhalt aller Dateien im Arbeitsverzeichnis suchen und Ihnen mitteilen, wie viele übereinstimmten.

Wolf
quelle
1
Dies funktioniert nicht, wenn sich viele Dateien im Verzeichnis befinden. Es wird der Fehler "zsh: argument list too long: grep" ausgegeben. Irgendwelche Ideen, wie man das loswerden kann?
1
@ user16142 grep das Verzeichnis anstelle der Dateien: grep -lr "string" directory | wc -lWenn Sie keine rekursive Suche wünschen, können Sie die Option find with maxdepth verwenden: find directory -maxdepth 1 -type f -exec grep -l "string" {} + | wc -lBeachten Sie, dass diese zweite Option langsamer ist als grep.
Agargara
9

grepDer Parameter s -lgibt nur die passenden Dateinamen aus $PATTERNund wckann diese anschließend zählen.

grep -l "$PATTERN" * | wc -l
wedeln
quelle
danke, habe mich aber mit einem
Wenn ja, nimm Wolfs Antwort.
wag
3
awk '/pattern_to_look_for/ {s+=1; nextfile;} END {print s}' *

Erläuterung: Hierbei wird nach der Anzahl der Dateien gesucht, deren Inhalt "pattern_to_look_for" enthält und nicht nach deren Dateinamen (wie bei Wags Antwort). Anhand Ihrer Frage ist schwer zu erkennen, wonach Sie suchen.

Jan Persson
quelle
Fehlt etwas? weil es nicht funktioniert
Wenn Sie nach dem String duck suchen, müssen Sie ihn wie / duck / in Awk schreiben. Machst du das
Jan Persson
ja, die Ausgabe: awk: Lesefehler (Ist ein Verzeichnis)
Wolfs Antwort gibt dir Duplikate. Wenn in einer der Dateien mehrere Vorkommen der gesuchten Zeichenfolge vorhanden sind, wird dies als zusätzliche Übereinstimmung gewertet.
Jan Persson
Nun, wenn Sie Verzeichnisse im Ordner haben, müssen Sie einige zusätzliche Dinge find . ! -name . -prune -type ftun, wie den Stern durch so etwas zu ersetzen (verpassen Sie nicht die Backticks). Dieser Befehl listet nur die Dateien im Ordner auf.
Jan Persson
2

Dies funktioniert in Bash mit jedem Dateinamen:

grep -lZ "$pattern" * | tr -cd '\000' | wc -c

Erläuterung:

  • grepDie -ZOption von gibt jedes Ergebnis mit einem ␀-Byte-Trennzeichen aus. Dieses Zeichen darf nicht Teil eines Dateinamens sein. Wir können also einfach die Anzahl der Trennzeichen zählen, um die Anzahl der Dateien zu ermitteln.
  • Um die anderen Zeichen in der Ausgabe loszuwerden, entfernen wir einfach alles außer den Bytes, die verwendet werden tr.
  • Dann zählen Sie einfach die Zeichen mit wc.
l0b0
quelle