Dateien mithilfe einer Schleife auf eine Zeichenfolge prüfen

Dateien mithilfe einer Schleife auf eine Zeichenfolge prüfen

Ich versuche, Dateien in einem Verzeichnis zu durchlaufen, die mit der in der forAnweisung angegebenen Zeichenfolge beginnen. Innerhalb der Schleife möchte ich in der Datei nach der Musterzeichenfolge suchen foo. Wenn die Zeichenfolge in der Datei gefunden wird, möchte ich echodie $filename.

#!/ppp/bash

for filename in $(find ~/filesList -type f -name "pge_*")
do
      #If 'foo' located echo $filename
      
done

Ich bin für jeden Vorschlag sehr dankbar.

Antwort1

findZum Ausführen verwenden grep:

find ~/filesList -type f -name 'pge_*' -exec grep -lF -- foo {} +

-llistet die Namen der Dateien auf, die eine Übereinstimmung für enthalten foo. -Fbedeutet, dass der Ausdruck fooals feste Zeichenfolge und nicht als regulärer Ausdruck zu verstehen ist.

Antwort2

Erster Vorschlag: Sie müssen es findin Ihrer forSchleife nicht verwenden, da es die Dinge verlangsamt. Sie können stattdessen etwas wie Folgendes tun:

for f in ~/filesList/pge_*

Ein ziemlich wichtiger Vorbehalt besteht darin, dass diese vereinfachte Version keine Unterverzeichnisse durchsucht, ~/filesListwährend die findVersion dies tut. Abhängig von Ihrem tatsächlichen Anwendungsfall ist eine Vereinfachung daher möglicherweise nicht möglich.

Für die Suche in diesen Dateien sollten Sie eine grepArt Konstrukt verwenden:

if (grep needle haystack > /dev/null 2>&1)
then
  echo $f
fi

Wenn grepdie gesuchte Nadel gefunden wird, gibt es einen Wert ungleich Null zurück, die Bedingung wird also als WAHR ausgewertet. Ich verwende die , > /dev/null 2>&1um die Ergebnisse von nicht sehen zu müssen grep. Wenn grepdie Nadel im Heuhaufen nicht gefunden wird, ist der Rückgabewert 0, die Bedingung ist also FALSCH und die thenAnweisung wird umgangen.

verwandte Informationen