it-swarm.com.de

Wie finde ich alle Dateien, die KEINE Textzeichenfolge enthalten?

Mit welchem ​​ prägnanten Befehl kann ich alle Dateien finden, die KEINE Textzeichenfolge enthalten?

Ich habe dies ohne Glück versucht (mit -v, um die Parameter von grep zu invertieren):

find . -exec grep -v -l shared.php {} \;

Jemand sagte, das würde funktionieren:

find . ! -exec grep -l shared.php {} \;

Aber es scheint bei mir nicht zu funktionieren.

Diese Seite hat dieses Beispiel:

find ./logs -size +1c  > t._tmp
while read filename
do
     grep -q "Process Complete" $filename
     if [ $? -ne 0 ] ; then
             echo $filename
     fi
done < t._tmp
rm -f t_tmp

Aber das ist umständlich und überhaupt nicht prägnant.

ps: Ich weiß, dass grep -L * wird dies tun, aber wie ich den Befehl find in Kombination mit grep für ausgeschlossene Dateien verwenden kann, ist das, was ich wirklich wissen möchte.

pss: Ich bin mir auch nicht sicher, wie ich grep-Unterverzeichnisse mit dem grep -L * Syntax, aber ich möchte immer noch wissen, wie man es mit find verwendet :)

40
cwd
find . -type f | xargs grep -H -c 'shared.php' | grep 0$ | cut -d':' -f1    

OR

find . -type f -exec grep -H -c 'shared.php' {} \; | grep 0$ | cut -d':' -f1

Hier berechnen wir die Anzahl der übereinstimmenden Zeilen (mit -c) in einer Datei, wenn die Anzahl 0 ist, dann ist es die erforderliche Datei, also schneiden wir die erste Spalte, d. h. den Dateinamen, aus der Ausgabe.

9
Sachin Divekar

Ihr Fund sollte funktionieren, wenn Sie -v -l (Dateien, deren Zeile nicht übereinstimmt) zu -L (Dateien ohne übereinstimmende Zeilen), aber Sie können auch die rekursive Datei von grep verwenden (-r) Möglichkeit:

grep -rL shared.php .
61
Kevin

Ich weiß das grep -L * wird dies tun, aber wie kann ich den Befehl find in Kombination mit grep verwenden, um Dateien auszuschließen, ist das, was ich wirklich wissen möchte

Sie könnten find und grep folgendermaßen verwenden:

find . -type f ! -exec grep -q 'PATTERN' {} \; -print

Hier -print wird nur ausgeführt, wenn der vorherige Ausdruck: ! -exec ... {} wird als true ausgewertet.
Also für jede gefundene Datei grep -q 'PATTERN' ist executed, wenn das Ergebnis false ist, dann der gesamte Ausdruck ! -exec grep -q 'PATTERN' wird als true ausgewertet und der Dateiname lautet printed.

4
don_crissti

Sie finden das nicht übereinstimmende Ergebnis mit der Option -L

grep -iL shared.php .
1
prakash