Wie finde und zähle ich, wie viele Dateien ein bestimmtes Wort enthalten?

7

Ich soll die Anzahl der Dateien finden und anzeigen, die das Wort Karotte enthalten (Groß- / Kleinschreibung ignoriert).

Bisher habe ich Folgendes: Ich bin mir nur nicht sicher, wie ich das WC hinzufügen soll, um zu zählen, wie viele Dateien das Wort Karotte enthalten

finden . -exec grep -i Karotte {} \;

John
quelle
Wie würde ich das mit dem Befehl find machen? Entschuldigung für die Nichtangabe.
John
1
Warum möchten Sie find verwenden? grep -rist rekursiv.
Marco

Antworten:

13

Erstens, wie andere gesagt haben, gibt es keinen Grund find, nur rekursiv zu verwenden grep:

grep -irm 1 carrot . | wc -l 

Die -m 1sorgt dafür , dass grepstoppen jede Datei nach dem ersten Spiel zu suchen. Ohne sie zählen Sie nicht die Anzahl der Dateien , die enthalten, carrotsondern die Anzahl der Zeilen . Dieselbe Datei wird mehrmals gezählt, wenn sie mehrere Instanzen von enthält carrot. Von man grep:

    -r, --recursive
          Read all files  under  each  directory,  recursively,  following
          symbolic  links  only  if they are on the command line.  This is
          equivalent to the -d recurse option.
   -i, --ignore-case
          Ignore  case  distinctions  in  both  the  PATTERN and the input
          files.  (-i is specified by POSIX.)
   -m NUM, --max-count=NUM
          Stop reading a file after NUM matching lines. 

Wenn Sie es wirklich, wirklich mit find machen wollen, könnten Sie es tun

find . -type f -exec grep -im 1 carrot {} \; | wc -l

Beachten Sie, dass ich spezifiziere, -type fda Sie keine grepVerzeichnisse möchten .

terdon
quelle
1
Das ist nicht richtig. Die Bereitstellung -m 1wird nach einer Übereinstimmung beendet, nicht nach einer Übereinstimmung pro Datei. Das wird also eigentlich immer 1 zurückgeben. Ich denke, die zweite Lösung macht es aber richtig.
Phonon
@Phonon nein, wird es nicht, versuchen Sie es. Zumindest auf meinem Linux-System findet es die erste Übereinstimmung in jeder Datei. grep -rbefasst sich immer noch mit einzelnen Dateien, es sind nicht nur catalle.
Terdon
4

Finden Sie die Anzahl der Dateien, die das Wort Karotte enthalten

number_of_files=`grep -l -r -i "carrot" . | wc -l`

Bedeutung für die grepArgumente:

-l, --files-with-matches
         Only the names of files containing selected lines are written to standard output.  grep will only search a file until a match has been found, making
         searches potentially less expensive.  Pathnames are listed once per file searched.  If the standard input is searched, the string ``(standard
         input)'' is written.

-R, -r, --recursive
         Recursively search subdirectories listed.

-i : case insenstive

wc -l: Gibt die Anzahl der Zeilen aus, die als Eingabe für das Programm übergeben wurden. In unserem Fall sind diese Zeilen die Namen von Dateien mit übereinstimmendem Eingabemuster, die von gefunden wurden grep.

Drucken Sie die Ausgabe

echo $number_of_files
smRaj
quelle
1
@ Downvoter möchten Sie den Grund kommentieren?
smRaj
Ich habe nicht abgestimmt, aber dies zählt nicht die Anzahl der Dateien, die eine Zeichenfolge enthalten, sondern die Anzahl der Zeilen, die diese enthalten. Wenn eine Datei drei Zeilen enthält, die dem gesuchten Muster entsprechen, wird sie dreimal gezählt. Auch Sie nicht brauchen , wcda grepdie hat -cOption. Fügen Sie doppelte Übereinstimmungen hinzu -cund -m 1vermeiden Sie diese.
Terdon
@terdon: Ich habe nicht genug Ruf, um Ihre Antwort zu kommentieren. Also, ich sage es hier, OP benötigt die Gesamtzahl der Dateien, die das Wort "Karotte" enthalten. Sie grep -ircm 1 carrot .geben nicht die Anzahl der Dateien an, die eine Zeichenfolge enthalten. Stattdessen gibt die Option -c die Anzahl der Übereinstimmungen für das gesuchte Muster an, das pro Dateibasis gefunden wurde. Beispiel; filename1:count filename2:count. Ich bin nicht sicher,
ob
@terdon: Zusätzlich mit grep -ircm 1 carrot ., druckt grep Dateinamen aus, auch wenn es nicht carrotmit Null als Anzahl enthält wie:file_name1:0 file_name2:0
smRaj
Du hast ganz recht, tut mir recht, wenn ich zu schnell poste, danke. -list besser als -mauch, aber hey, ich bleibe bei meinem Weg, da du es bereits benutzt :)
terdon
3

Eine Variante der smRaj-Lösung wäre ein doppelter Aufruf von grep. Das Folgende würde das gleiche Ergebnis wie grep [ etc ] | ergeben wc -l :

grep -l -r -i "carrot" . | grep -c .

Im Folgenden wird eine nummerierte Liste der Dateien gedruckt, die das gesuchte Wort enthalten.

grep -l -r -i "carrot" . | grep -n .
Railgun2
quelle
+1 Ich wollte genau etwas beantworten, als ich sah, dass Sie bereits haben :)
Joseph R.