
Ich versuche, Dateien in einem Verzeichnis zu durchlaufen, die mit der in der for
Anweisung 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 echo
die $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
find
Zum Ausführen verwenden grep
:
find ~/filesList -type f -name 'pge_*' -exec grep -lF -- foo {} +
-l
listet die Namen der Dateien auf, die eine Übereinstimmung für enthalten foo
. -F
bedeutet, dass der Ausdruck foo
als feste Zeichenfolge und nicht als regulärer Ausdruck zu verstehen ist.
Antwort2
Erster Vorschlag: Sie müssen es find
in Ihrer for
Schleife 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, ~/filesList
während die find
Version 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 grep
Art Konstrukt verwenden:
if (grep needle haystack > /dev/null 2>&1)
then
echo $f
fi
Wenn grep
die 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>&1
um die Ergebnisse von nicht sehen zu müssen grep
. Wenn grep
die Nadel im Heuhaufen nicht gefunden wird, ist der Rückgabewert 0, die Bedingung ist also FALSCH und die then
Anweisung wird umgangen.