Подтвердить что ты не робот

Как найти файлы, которые не содержат заданный шаблон строки?

Как узнать файлы в текущем каталоге, которые не содержат слово foo (используя grep)?

4b9b3361

Ответ 1

Следующая команда дает мне все файлы, которые не содержат шаблон foo:

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep 0

Ответ 2

Если ваш grep имеет параметр -L (или --files-without-match):

$ grep -L "foo" *

Ответ 3

Взгляните на ack. Он автоматически .svn для вас, дает вам регулярные выражения Perl и представляет собой простую загрузку одной программы Perl.

Эквивалент того, что вы ищете, должен быть в ack:

ack -L foo

Ответ 4

Следующая команда исключает необходимость отладки отфильтровывать папки svn с помощью второго grep.

grep -rL "foo" ./* | grep -v "\.svn"

Ответ 5

Вам действительно понадобятся:

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep :0\$

Ответ 6

Мне повезло с

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

Мои попытки с grep -v просто дали мне все строки без "foo".

Ответ 7

У моего grep нет опции -L. Я нахожу обходное решение для достижения этого.

Идеи:

  • чтобы слить все имя файла, содержащее искомую строку, в txt1.txt.
  • удалите все имя файла в каталоге в txt2.txt.
  • сделать разницу между двумя файлами дампа с командой diff.

    grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt
    grep * *.log | cut -c1-14 | uniq > txt2.txt
    diff txt1.txt txt2.txt | grep ">"
    

Ответ 8

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

Вы можете указать фильтр под "find" и строку исключения в разделе "grep -vwE". Используйте mtime в поиске, если вам нужно также фильтровать изменения по времени.

Ответ 9

Открыть отчет об ошибке

Как прокомментировал @tukan, есть открытый отчет об ошибке для Ag относительно -L/--files-without-matches:

Поскольку в отчете об ошибках мало прогресса, -L опцию -L упомянутую ниже, а не до тех пор, пока ошибка не будет решена. Вместо этого используйте различные подходы, представленные в этом потоке. Ссылаясь на комментарий к отчету об ошибке [акцент мой]:

Любые обновления по этому вопросу? -L полностью игнорирует совпадения в первой строке файла. Похоже, если скоро это не будет исправлено, флаг должен быть полностью удален, так как он фактически не работает так, как рекламируется вообще.


Silver Searcher - Ag (предназначенная функция - см. Отчет об ошибке)

В качестве мощной альтернативы grep вы можете использовать The Silver Searcher - Ag:

Инструмент поиска кода похож на ack, с акцентом на скорость.

Если посмотреть на man ag, мы найдем -L или --files-without-matches:

...

OPTIONS
    ...

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

То есть для рекурсивного поиска файлов, которые не соответствуют foo, из текущего каталога:

ag -L foo

Чтобы искать только текущий каталог для файлов, которые не соответствуют foo, просто укажите --depth=0 для рекурсии:

ag -L foo --depth 0

Ответ 10

проблема

Мне нужно реорганизовать большой проект, который использует файлы .phtml для записи HTML с использованием встроенного кода PHP. Я хочу использовать вместо этого шаблоны усов. Я хочу найти все .phtml.phtml, которые не содержат строку new Mustache как они все еще должны быть переписаны.

Решение

find. -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'

объяснение

Перед трубами:

найти

find. Поиск файлов рекурсивно, начиная с этого каталога

-iname '*.phtml' Имя файла должно содержать .phtml (i делает его без .phtml регистра)

-exec 'grep -H -E -o -c 'new Mustache' {}' Запустите команду grep на каждом из соответствующих путей

Grep

-H Всегда печатать заголовки имен файлов с выходными строками.

-E Интерпретировать шаблон как расширенное регулярное выражение (то есть заставить grep вести себя как egrep).

-o Печатает только совпадающую часть строк.

-c Только стандартный номер выбранных строк записывается в стандартный вывод.


Это даст мне список всех путей к файлам, заканчивающихся на .phtml, со счетчиком количества раз, когда строка new Mustache встречается в каждом из них.

$> find . -iname '*.phtml$' -exec 'grep -H -E -o -c 'new Mustache' {}'\;

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/orders.phtml:1
./app/MyApp/Customer/View/Account/banking.phtml:1
./app/MyApp/Customer/View/Account/applycomplete.phtml:1
./app/MyApp/Customer/View/Account/catalogue.phtml:1
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0

Первая труба grep :0$ фильтрует этот список, чтобы включить только строки, заканчивающиеся на :0:

$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0

Второй канал sed 's/..$//' удаляет последние два символа каждой строки, оставляя только пути к файлам.

$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml
./app/MyApp/Customer/View/Account/studio.phtml
./app/MyApp/Customer/View/Account/classadd.phtml
./app/MyApp/Customer/View/Account/orders-trade.phtml

Ответ 11

Вы можете сделать это только с помощью grep (без поиска).

grep -riL "foo" .

Это объяснение параметров, используемых на grep

     -L, --files-without-match
             each file processed.
     -R, -r, --recursive
             Recursively search subdirectories listed.

     -i, --ignore-case
             Perform case insensitive matching.

Если вы используете l (в нижнем регистре), вы получите противоположное (файлы с совпадениями)

     -l, --files-with-matches
             Only the names of files containing selected lines are written

Ответ 12

grep -irnw "filepath" -ve "pattern"

или

grep -ve "pattern" < file

выше команда даст нам результат, так как -v находит обратный образец поиска

Ответ 13

Следующая команда может помочь вам отфильтровать строки, которые включают подстроку "foo".

cat file | grep -v "foo"