Wie finde ich die Dateien im aktuellen Verzeichnis, die nicht enthalten das Wort foo
(mit grep
)?Wie finde ich Dateien, die kein bestimmtes Zeichenfolgenmuster enthalten?
Antwort
Der folgende Befehl gibt mir alle Dateien, die das Muster nicht foo
enthalten:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0
Wenn Ihr grep die -L
(oder --files-without-match
) Option:
$ grep -L "foo" *
oder das Äquivalent mit [ack] (http://betterthangrep.com/): 'ack -L 'foo'' – asymmetric
Wie bereits an anderer Stelle erwähnt, hilft ack dabei, .svn (Subversion) -Dateien standardmäßig zu vermeiden. – GuruM
@GuruM Dies kann in GNU Grep erfolgen, indem die Variable 'GREP_OPTIONS = 'exportiert wird - exclude-dir = .svn --exclude-dir = .git'': ^) – bufh
ich viel Glück hatte mit
grep -H -E -o -c "foo" */*/*.ext | grep ext:0
Meine Versuche mit grep -v
gab mir einfach alle Zeilen ohne "foo".
Sie müssen tatsächlich:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
einen Blick auf ack
nehmen. Es macht den .svn
Ausschluss für Sie automatisch, gibt Ihnen Perl-Ausdrücke und ist ein einfacher Download eines einzelnen Perl-Programms.
Das entspricht dem, was Sie suchen sollten, in ack
sein:
ack -L foo
Nein, das gibt alle Zeilen zurück, die nicht mit 'foo' übereinstimmen. was er sucht, ist 'ack -L foo' – asymmetric
Der folgende Befehl schließt die Notwendigkeit, dass die Entdeckung durch die svn
Ordner zu filtern, um eine zweite grep
verwenden.
grep -rL "foo" ./* | grep -v "\.svn"
Der folgende Befehl könnte Ihnen helfen, die Zeilen zu filtern, die die Teilzeichenfolge "foo" enthalten.
cat file | grep -v "foo"
Dies druckt Zeilen, die nicht übereinstimmen, nicht Namen von Dateien, die keine Übereinstimmung in einer Zeile enthalten. Um Beleidigung der Verletzung hinzuzufügen, ist es ein [nutzloser Gebrauch von 'Katze'] (http://www.iki.fi/era/unix/award.html). – tripleee
grep -irnw "filepath" -ve "pattern"
oder
grep -ve "pattern" < file
obige Befehl wird uns das Ergebnis als -v die Umkehrung des Musters durchsuchte findet
Dies druckt die Zeilen, die das Muster nicht enthalten. Sie können die Option "-l" hinzufügen, um nur den Dateinamen zu drucken. aber das druckt immer noch die Namen von jeder Datei, die * any * Zeile enthält, die das Muster nicht enthält. Ich glaube, das OP möchte die Dateien finden, die keine Zeile enthalten, die das Muster enthält. – tripleee
Meine grep keine Option -L hat. Ich finde Abhilfe, um dies zu erreichen.
Die Ideen sind:
- alle Dateinamen, um die verdiente String in einen txt1.txt Dump enthält.
- dump den gesamten Dateinamen im Verzeichnis zu einem txt2.txt.
machen Sie den Unterschied zwischen der 2-Dump-Datei mit Diff-Befehl.
grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt grep * *.log | cut -c1-14 | uniq > txt2.txt diff txt1.txt txt2.txt | grep ">"
Ich vergesse die Befehle, aber statt Dateinamen zu verwerfen, können Sie tatsächlich ein Diff zwischen zwei Ausgabeströmen machen (ich denke, Sie umgeben die Befehle in Klammern, und da ist auch irgendwo eine spitze Klammer), wenn Ihre Systeme dies unterstützen , was ich denke, ist die Frage, da es 'grep -L 'nicht unterstützt –
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Sie können die Filter unter "finden" angeben und den Ausschluß Zeichenfolge unter "grep -vwE".Verwenden Sie mtime unter find, wenn Sie auch nach modifizierter Zeit filtern müssen.
Dies scheint mir alle Zeilen ohne die Zeichenfolge zu zeigen, fragt das OP nur nach den Dateinamen. –
Sie möchten die Grep 0 am Ende zu Grep 0 ändern $ (sonst erhalten Sie fehlerhafte Übereinstimmungen für Dateien, deren Name das Zeichen 0 enthält). – clouseau
@clouseau ist meistens richtig ... Allerdings würde 'grep '0 $'' Dateien mit einem Vielfachen von 10 Zeilen vergleichen! Sie brauchen 'grep ': 0 $'' am Ende, um nach einem expliziten ': 0' am Ende der Zeile zu suchen. Dann erhalten Sie nur Dateien mit übereinstimmenden Nullzeilen. – TrinitronX
Das UNIX, auf dem ich bin, hatte keine Versionen von find oder grep mit diesen Optionen, also musste ich mit dem in anderen Kommentaren vorgeschlagenen "ack" -Befehl gehen. –