Welchen präzisen Befehl kann ich verwenden, um alle Dateien zu finden, die KEINE Textzeichenfolge enthalten?
Ich habe dies (mit -v, um die grep-Parameter zu invertieren) ohne Erfolg versucht:
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 *
dies der Fall sein wird, aber wie kann ich den Befehl find in Kombination mit grep verwenden, um Dateien auszuschließen, ist das, was ich wirklich wissen möchte.
pss: Ich bin mir auch nicht sicher, wie man Grep-Unterverzeichnisse in die grep -L *
Syntax einbindet , aber ich möchte trotzdem wissen, wie man es mit verwendet find
:)
Antworten:
ODER
Hier berechnen wir die Anzahl der übereinstimmenden Zeilen (unter Verwendung von
-c
) in einer Datei, wenn die Anzahl 0 ist, dann ist es die erforderliche Datei, also schneiden wir die erste Spalte, dh den Dateinamen, aus der Ausgabe.quelle
grep
dies behoben wäre, würde dies immer noch keine Dateinamen:
oder Zeilenumbrüche annehmen ...Ihre Suche sollte funktionieren, wenn Sie
-v -l
(Dateien mit einer nicht übereinstimmenden Zeile) in-L
(Dateien ohne übereinstimmende Zeilen) ändern. Sie können jedoch auch die Optiongrep
recursive (-r
) verwenden:quelle
find . -exec grep -v -l shared.php {} \;
(und alle anderen Varianten, die ich ausprobiert habe) funktioniert nicht für mich. Ich bin auf OS X, aber ich denke nicht, dass das eine Rolle spielen sollte. Ich habe dir +1 gegeben, weil ich die-r
Option vergessen habe .-L
Du könntest folgendes benutzen
find
undgrep
mögen:Hier
-print
wird nur ausgeführt, wenn der vorherige Ausdruck:! -exec ... {}
als ausgewertet wirdtrue
.Also für jede Datei gefunden,
grep -q 'PATTERN'
wirdexec
ausgeschüttete, wenn das Ergebnisfalse
dann der gesamte Ausdruck! -exec grep -q 'PATTERN'
auswertet , wietrue
und der Dateinameprint
ed.quelle
grep -L
, da auch die nicht lesbaren Dateien in die Liste aufgenommen werden.Sie finden kein passendes Ergebnis mit der Option -L
quelle
Ich denke, Sie suchen nach einem Befehl wie
Die Option
-q
machtgrep
verlassen und nach der Verwendung-execdir
müssen Sie-print
gefundene Dateien drucken.quelle