Как узнать файлы в текущем каталоге, которые не содержат слово foo
(используя grep
)?
Как найти файлы, которые не содержат заданный шаблон строки?
Ответ 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"