Работает как волшебство! Подсказка: используйте -rLвместо того, -Lчтобы сопоставлять подкаталоги
Ufos
1
@Larry - более чистый способ избежать проблем с глобализацией - это использовать «пустой» параметр long, например: grep -L 'foo' -- *Стандартные команды, которые используют длинные параметры, используют, --чтобы указать, что после этого пункта больше нет параметров.
Пэдди Ландау
45
Посмотрите на ack. Он .svnавтоматически исключает вас, предоставляет регулярные выражения Perl и представляет собой простую загрузку одной программы Perl.
Вы хотите изменить grep 0 в конце на grep 0 $ (в противном случае вы получите ошибочные совпадения для файлов, которые имеют символ 0 в имени файла).
clouseau
9
@clouseau в основном прав ... Тем не менее, grep '0$'файлы тоже должны быть кратны 10 строкам! Вам нужно grep ':0$'в конце проверить наличие явного ': 0' в конце строки. Тогда вы получите только файлы с нулевыми строками.
TrinitronX
В UNIX, на котором я работаю, не было версий find или grep с этими параметрами, поэтому мне пришлось воспользоваться командой «ack», предложенной в других комментариях.
KC Baltz
14
Следующая команда исключает необходимость поиска, чтобы отфильтровать svnпапки с помощью секунды grep.
Мне нужно реорганизовать большой проект, который использует .phtmlфайлы для записи HTML с использованием встроенного кода PHP. Я хочу использовать шаблоны усов вместо. Я хочу найти любые .phtmlфайлы, которые не содержат строку, так new Mustacheкак они все еще должны быть переписаны.
Я забываю команды, но вместо того, чтобы записывать имена файлов, вы можете фактически сделать diffмежду двумя выходными потоками (я думаю, что вы окружаете команды круглыми скобками, и где-то тоже есть угловая скобка), если ваши системы поддерживают это, что, я думаю, вопрос, так как он не поддерживаетgrep -L
Dexygen
1
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Вы можете указать фильтр в «find» и строку исключения в «grep -vwE». Используйте mtime в find, если вам нужно фильтровать и измененное время.
Поскольку в отчете об ошибках имеется небольшой прогресс, на -Lуказанную ниже опцию не следует полагаться , пока ошибка не будет устранена. Вместо этого используйте различные подходы, представленные в этой теме. Цитирую комментарий к сообщению об ошибке [выделено мной]:
Есть какие-нибудь обновления по этому поводу? -Lполностью игнорирует совпадения в первой строке файла. Похоже, если это не будет исправлено в ближайшее время, флаг должен быть полностью удален, так как он фактически не работает так, как рекламируется вообще .
Серебряный поисковик - Ag (предполагаемая функция - см. Отчет об ошибке)
Это печатает линии, которые не содержат шаблон. Вы можете добавить -lопцию, чтобы напечатать только имя файла; но это все еще печатает имена любого файла, который содержит любую строку, которая не содержит образец. Я полагаю, что ОП хочет найти файлы, которые не содержат строки, содержащей шаблон.
tripleee
Команда, которую вы предоставили, перечисляет файлы в «filepath» со всеми их строками, которые не содержат «pattern».
Апродан
-6
Следующая команда может помочь вам отфильтровать строки, содержащие подстроку "foo".
Это печатает строки, которые не совпадают, а не имена файлов, которые не содержат совпадений ни в одной строке. Чтобы добавить оскорбление травмы, это бесполезное использованиеcat .
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
: ^)ag -L 'foo'
-rL
вместо того,-L
чтобы сопоставлять подкаталогиgrep -L 'foo' -- *
Стандартные команды, которые используют длинные параметры, используют,--
чтобы указать, что после этого пункта больше нет параметров.Посмотрите на
ack
. Он.svn
автоматически исключает вас, предоставляет регулярные выражения Perl и представляет собой простую загрузку одной программы Perl.Эквивалент того, что вы ищете, должен быть в
ack
:источник
Вы можете сделать это только с помощью grep (без поиска).
Это объяснение параметров, используемых на
grep
Если вы используете
l
(в нижнем регистре), вы получите противоположное (файлы с совпадениями)источник
Следующая команда дает мне все файлы, которые не содержат шаблон
foo
:источник
grep '0$'
файлы тоже должны быть кратны 10 строкам! Вам нужноgrep ':0$'
в конце проверить наличие явного ': 0' в конце строки. Тогда вы получите только файлы с нулевыми строками.Следующая команда исключает необходимость поиска, чтобы отфильтровать
svn
папки с помощью секундыgrep
.источник
Вам действительно нужно:
источник
Мне повезло с
Мои попытки
grep -v
только что дали мне все строки без "foo".источник
проблема
Мне нужно реорганизовать большой проект, который использует
.phtml
файлы для записи HTML с использованием встроенного кода PHP. Я хочу использовать шаблоны усов вместо. Я хочу найти любые.phtml
файлы, которые не содержат строку, такnew Mustache
как они все еще должны быть переписаны.Решение
find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
объяснение
Перед трубами:
найти
find .
Поиск файлов рекурсивно, начиная с этого каталога-iname '*.phtml'
Имя файла должно содержать.phtml
(i
делает его без учета регистра)-exec 'grep -H -E -o -c 'new Mustache' {}'
Запуститеgrep
команду на каждом из подходящих путейGrep
-H
Всегда печатайте заголовки файлов с выходными строками.-E
Интерпретировать шаблон как расширенное регулярное выражение (то есть заставить grep вести себя как egrep).-o
Печатает только совпадающую часть строк.-c
Только количество выбранных строк записывается в стандартный вывод.Это даст мне список всех путей к файлам, оканчивающихся на
.phtml
, со счетчиком количества встречений строкиnew Mustache
в каждом из них.Первый канал
grep :0$
фильтрует этот список, чтобы включить только строки, оканчивающиеся на:0
:Второй канал
sed 's/..$//'
удаляет последние два символа каждой строки, оставляя только пути к файлам.источник
Если вы используете git, он ищет все отслеживаемые файлы:
и вы можете искать в подмножестве отслеживаемых файлов, если у вас включена ** подкаталогная подстановка (
shopt -s globstar
в .bashrc, смотрите это ):источник
У моего grep нет опции -L. Я нахожу обходной путь для достижения этой цели.
Идеи:
сделайте разницу между файлом 2 dump командой diff.
источник
diff
между двумя выходными потоками (я думаю, что вы окружаете команды круглыми скобками, и где-то тоже есть угловая скобка), если ваши системы поддерживают это, что, я думаю, вопрос, так как он не поддерживаетgrep -L
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
Вы можете указать фильтр в «find» и строку исключения в «grep -vwE». Используйте mtime в find, если вам нужно фильтровать и измененное время.
источник
Открыть отчет об ошибке
Как прокомментировал @tukan, есть открытый отчет об ошибке для Ag относительно флага
-L
/--files-without-matches
:--files-without-matches
работает неправильноПоскольку в отчете об ошибках имеется небольшой прогресс, на
-L
указанную ниже опцию не следует полагаться , пока ошибка не будет устранена. Вместо этого используйте различные подходы, представленные в этой теме. Цитирую комментарий к сообщению об ошибке [выделено мной]:Серебряный поисковик - Ag (предполагаемая функция - см. Отчет об ошибке)
В качестве мощной альтернативы
grep
вы можете использовать Серебряный Искатель - Ag :Глядя на
man ag
, мы находим-L
или--files-without-matches
вариант:Т.е. для рекурсивного поиска файлов, которые не совпадают
foo
, из текущего каталога:Чтобы искать только в текущем каталоге файлы, которые не совпадают
foo
, просто укажите--depth=0
рекурсию:источник
-L
ошибки - github.com/ggreer/the_silver_searcher/issues/238другая альтернатива, когда у grep нет опции -L (например, IBM AIX), только с grep и оболочкой:
источник
или
Команда выше даст нам результат, так как -v находит инверсию искомого шаблона
источник
-l
опцию, чтобы напечатать только имя файла; но это все еще печатает имена любого файла, который содержит любую строку, которая не содержит образец. Я полагаю, что ОП хочет найти файлы, которые не содержат строки, содержащей шаблон.Следующая команда может помочь вам отфильтровать строки, содержащие подстроку "foo".
источник
cat
.