Jak znaleźć pliki, które nie zawierają danego wzoru łańcucha?

Jak mogę znaleźć plikiw bieżącym katalogu, które Nie zawierają słowo foo (używając grep)?

Author: nbro, 2009-11-17

11 answers

Jeśli twój grep ma opcję -L (lub --files-without-match):

$ grep -L "foo" *
 650
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-04 17:39:03

Spójrz na ack. Wykonuje on automatycznie wyłączenie .svn, daje wyrażenia regularne Perla i jest prostym pobraniem pojedynczego programu Perla.

Odpowiednikiem tego, czego szukasz powinno być, w ack:

ack -L foo
 41
Author: Andy Lester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 14:13:56

Poniższe polecenie daje mi wszystkie pliki, które nie zawierają wzorca foo:

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep 0
 12
Author: Senthil Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 13:14:53

Poniższe polecenie wyklucza konieczność filtrowania folderów svn za pomocą drugiego grep.

grep -rL "foo" ./* | grep -v "\.svn"
 12
Author: user999305,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 13:56:19

Będziesz potrzebował:

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep :0\$
 6
Author: Forrest Tiffany,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 13:57:33

Miałem szczęście

grep -H -E -o -c "foo" */*/*.ext | grep ext:0

Moje próby z grep -v po prostu dał mi wszystkie linie bez "foo".

 5
Author: Johnny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 13:56:37

Otwórz raport o błędzie

Jak skomentował @tukan, jest otwarty raport o błędzie dla Ag dotyczący -L/--files-without-matches flaga:

Ponieważ postępy w zgłaszaniu błędów są niewielkie, opcja -L wymieniona poniżej nie powinna być oparta na , dopóki błąd nie został rozwiązany. Zamiast tego użyj różnych podejść przedstawionych w tym wątku. Cytowanie komentarza do błędu "raport": {]}

Jakieś wieści na ten temat? -L całkowicie ignoruje dopasowania w pierwszej linii pliku. Wygląda na to, że jeśli to nie zostanie wkrótce naprawione, flaga powinna zostać całkowicie usunięta, ponieważ skutecznie nie działa tak, jak jest reklamowana.

Silver Searcher-Ag (funkcja zamierzona - zobacz Raport o błędzie)

[[17]}jako potężną alternatywę dla grep, możesz użyć Silver Searcher - Ag :

Narzędzie do wyszukiwania kodu podobne do ack, z naciskiem na szybkość.

Patrząc na man ag, znajdujemy opcję -L lub --files-without-matches:

...

OPTIONS
    ...

    -L --files-without-matches
           Only print the names of files that don´t contain matches.

Czyli do rekurencyjnie Wyszukaj pliki, które nie pasują foo, z bieżącego katalogu:

ag -L foo

Aby przeszukiwać tylko bieżący katalog dla plików, które nie pasują do foo, po prostu określ --depth=0 dla rekurencji:

ag -L foo --depth 0
 2
Author: dfri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 13:28:44

Mój grep nie ma żadnej opcji-L. Znajduję obejście, aby to osiągnąć.

Pomysły są:

  1. aby zrzucić całą nazwę pliku zawierającą Zasłużony ciąg znaków do txt1.txt.
  2. zrzuca całą nazwę pliku w katalogu do txt2.txt.
  3. Zrób różnicę między 2 zrzutem pliku za pomocą polecenia diff.

    grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt
    grep * *.log | cut -c1-14 | uniq > txt2.txt
    diff txt1.txt txt2.txt | grep ">"
    
 1
Author: user6305682,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-08 03:37:47

find *20161109* -mtime -2|grep -vwE "(TRIGGER)"

Możesz określić filtr w "Znajdź", a łańcuch wykluczeń w "grep-vwE". Użyj mtime w obszarze Znajdź, jeśli chcesz filtrować zmodyfikowany czas.

 1
Author: zandeep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-10 19:31:55
grep -irnw "filepath" -ve "pattern"

Lub

grep -ve "pattern" < file

Powyższe polecenie da nam wynik, ponieważ-v znajdzie odwrotność przeszukiwanego wzorca

 -3
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-30 18:43:26

Poniższe polecenie może pomóc w filtrowaniu linii zawierających podłańcuch "foo".

cat file | grep -v "foo"
 -3
Author: walkerlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-07 13:58:35