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?

Antworten:


29

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


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

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.


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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.