Wie finde ich die Dateien im aktuellen Verzeichnis heraus, die das Wort nicht enthalten foo
(using grep
)?
536
Wenn Ihr grep die Option -L
(oder --files-without-match
) hat:
$ grep -L "foo" *
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
: ^)ag -L 'foo'
-rL
anstelle von-L
, um Unterverzeichnissegrep -L 'foo' -- *
Standardmäßig werden Befehle mit langen Optionen verwendet,--
um anzuzeigen, dass nach diesem Punkt keine Optionen mehr vorhanden sind.Schau es dir an
ack
. Es schließt den.svn
Ausschluss automatisch für Sie aus, gibt Ihnen reguläre Perl-Ausdrücke und ist ein einfacher Download eines einzelnen Perl-Programms.Das Äquivalent zu dem, was Sie suchen, sollte sein in
ack
:quelle
Sie können es mit grep alleine machen (ohne zu finden).
Dies ist die Erklärung der verwendeten Parameter
grep
Wenn Sie
l
(Kleinbuchstaben) verwenden, erhalten Sie das Gegenteil (Dateien mit Übereinstimmungen)quelle
Der folgende Befehl gibt mir alle Dateien, die das Muster nicht enthalten
foo
:quelle
grep '0$'
Würde aber auch Dateien mit Vielfachen von 10 Zeilen abgleichen ! Sie müssengrep ':0$'
am Ende nach einem expliziten ': 0' am Ende der Zeile suchen. Dann erhalten Sie nur Dateien mit übereinstimmenden Nullzeilen.Der folgende Befehl schließt die Notwendigkeit aus, dass die Suche die
svn
Ordner mithilfe einer Sekunde herausfiltertgrep
.quelle
Sie benötigen tatsächlich:
quelle
Ich hatte viel Glück mit
Meine Versuche mit
grep -v
gaben mir nur alle Zeilen ohne "foo".quelle
Problem
Ich muss ein großes Projekt umgestalten, das
.phtml
Dateien verwendet, um HTML mit Inline-PHP-Code zu schreiben. Ich möchte stattdessen Moustache- Vorlagen verwenden. Ich möchte alle.phtml
Giles finden, die die Zeichenfolge nicht enthalten,new Mustache
da diese noch neu geschrieben werden müssen.Lösung
find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
Erläuterung
Vor den Rohren:
Finden
find .
Suchen Sie rekursiv nach Dateien, beginnend in diesem Verzeichnis-iname '*.phtml'
Der Dateiname muss enthalten.phtml
(dasi
macht es unabhängig von Groß- und Kleinschreibung)-exec 'grep -H -E -o -c 'new Mustache' {}'
Führen Sie dengrep
Befehl auf jedem der übereinstimmenden Pfade ausGrep
-H
Drucken Sie Dateinamen-Header immer mit Ausgabezeilen.-E
Interpretieren Sie das Muster als erweiterten regulären Ausdruck (dh zwingen Sie grep, sich als egrep zu verhalten).-o
Druckt nur den passenden Teil der Zeilen.-c
Es wird nur eine Anzahl ausgewählter Zeilen in die Standardausgabe geschrieben.Dies gibt mir eine Liste aller Dateipfade
.phtml
, die mit enden , mit einer Zählung, wie oft die Zeichenfolgenew Mustache
in jedem von ihnen vorkommt.Die erste Pipe
grep :0$
filtert diese Liste so, dass sie nur Zeilen enthält, die auf Folgendes enden:0
:Die zweite Pipe
sed 's/..$//'
entfernt die letzten beiden Zeichen jeder Zeile und lässt nur die Dateipfade übrig.quelle
Wenn Sie git verwenden, werden alle nachverfolgten Dateien durchsucht:
und Sie können in einer Teilmenge der verfolgten Dateien suchen, wenn Sie das
shopt -s globstar
Globbing des Unterverzeichnisses ** aktiviert haben ( in .bashrc, siehe dies ):quelle
Mein grep hat keine -L Option. Ich finde eine Problemumgehung, um dies zu erreichen.
Die Ideen sind:
Machen Sie den Unterschied zwischen der 2-Dump-Datei mit dem Befehl diff.
quelle
diff
auszugeben , können Sie tatsächlich einen zwischen zwei Ausgabestreams ausführen (ich denke, Sie umgeben die Befehle mit Klammern, und irgendwo gibt es auch eine spitze Klammer), wenn Ihr System dies unterstützt, was ich denke ist die Frage, da es nicht unterstütztgrep -L
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Sie können den Filter unter "find" und die Ausschlusszeichenfolge unter "grep -vwE" angeben. Verwenden Sie mtime unter find, wenn Sie auch nach geänderter Zeit filtern müssen.
quelle
Fehlerbericht öffnen
Wie von @tukan kommentiert, gibt es für Ag einen offenen Fehlerbericht bezüglich der
-L
/--files-without-matches
flag:--files-without-matches
funktioniert nicht richtigDa der Fehlerbericht kaum Fortschritte macht, sollte auf die
-L
unten genannte Option nicht vertraut werden , solange der Fehler nicht behoben wurde. Verwenden Sie stattdessen verschiedene in diesem Thread vorgestellte Ansätze. Zitieren eines Kommentars für den Fehlerbericht [Hervorhebung von mir]:The Silver Searcher - Ag (vorgesehene Funktion - siehe Fehlerbericht)
Als leistungsstarke Alternative zu
grep
können Sie The Silver Searcher - Ag verwenden :Beim Betrachten
man ag
finden wir die Option-L
oder--files-without-matches
:Dh, um rekursiv nach Dateien zu suchen, die nicht übereinstimmen
foo
, aus dem aktuellen Verzeichnis:Um nur das aktuelle Verzeichnis nach Dateien zu durchsuchen , die nicht übereinstimmen
foo
, geben Sie einfach--depth=0
für die Rekursion Folgendes an:quelle
-L
Fehlers fehl - github.com/ggreer/the_silver_searcher/issues/238Eine weitere Alternative, wenn grep nicht über die Option -L verfügt (z. B. IBM AIX), sondern nur grep und die Shell:
quelle
oder
Der obige Befehl gibt uns das Ergebnis, wenn -v die Umkehrung des gesuchten Musters findet
quelle
-l
Option hinzufügen , nur den Dateinamen zu drucken. aber das druckt immer noch die Namen der Datei , die enthält jede Zeile , die das Muster nicht enthalten. Ich glaube, das OP möchte die Dateien finden, die keine Zeile enthalten, die das Muster enthält.Der folgende Befehl kann Ihnen helfen, die Zeilen zu filtern, die den Teilstring "foo" enthalten.
quelle
cat
.