Я хочу исключить файл ./test/main.cpp
из моего поиска.
Вот что я вижу:
$ grep -r pattern --exclude=./test/main.cpp
./test/main.cpp:pattern
./lib/main.cpp:pattern
./src/main.cpp:pattern
Я знаю, что можно получить желаемый вывод, используя несколько команд в расположении каналов и фильтров, но есть ли какое-либо цитирование / экранирование, которое поможет grep
понять, чего я хочу изначально?
command-line
grep
nobar
источник
источник
--exclude-dir
). Вот почему я хотел бы, чтобы grep изначально выполнял исключение.Ответы:
grep
не может сделать это для файла в одном определенном каталоге, если у вас есть несколько файлов с одинаковым именем в разных каталогах, используйте вместо этого поиск:find . -type f \! -path './test/main.cpp' -exec grep pattern {} \+
источник
\!
и\+
? Кажется, работает нормально без обратной косой черты.grep
не могу этого сделать, используйтеfind
вместо этого» - отлично.Я не думаю, что это возможно с GNU
grep
. Тебе не нужны трубы, хотя.С
find
:С
zsh
:(исключает скрытые файлы, точно так же, как исключить .git, .svn ...).
источник
Я мог бы написать книгу: «Утерянное искусство
xargs
». Вfind ... -exec … ';
запускаете GREP для каждого файла (но вариант с-exec … +
не делает). Ну, в наши дни мы тратим процессорные циклы, так почему бы и нет, верно? Но если производительность, память и мощность являются проблемой: используйте xargs:ГНУ
find
«s-print0
будетNUL
-terminate своих выходных иxargs
»-0
опционное отличия , что формат в качестве входных данных. Это гарантирует, что любые смешные символы в вашем файле не будут запутаны.-r
Вариант гарантирует , что нет никакой ошибки в случаеfind
усматривает.Обратите внимание, теперь вы можете делать такие вещи, как:
GNU grep
-z
делает то же самое, что и xargs-0
.источник
find -exec (cmd) {} +
работает так же, какxargs
иfind -exec (cmd) {} \;
работает так же, какxargs -n1
. Другими словами, ваше утверждение верно только в том случае, если используется\;
версия.xargs
менее эффективно, чем использование-exec … +
(хотя и незначительно). Ни один из ответов здесь даже не упомянут-exec … \;
.-exec ... +
добавлено в январе 2005 года. Да, я не устарела ... на ... все.Если ваша
find
поддержка-path
была добавлена в POSIX в 2008 году, но все еще отсутствует в Solaris:источник
-path
не POSIX?Для записи, вот подход, который я предпочитаю:
Сохраняя
grep
в начале команды, я думаю, что это немного более ясно - плюс это не отключаетgrep
цветовую подсветку. В некотором смысле, использованиеfind
в подстановке команд - это просто способ расширения / замены (ограниченного) подмножества поиска файлов вgrep
функциональности.Для меня
find -exec
синтаксис довольно загадочный. Одной из сложностейfind -exec
является (иногда) необходимость экранирования различных символов (особенно если\;
используется в Bash). Просто для того, чтобы поместить вещи в привычный контекст, следующие две команды в основном эквивалентны:Если вы хотите исключить подкаталоги , может потребоваться использовать подстановочный знак. Я не совсем понимаю схему здесь - поговорим о тайной :
Еще одно замечание по обобщению
find
решений на основе сценариев для использования в сценариях :grep
командная строка должна включать параметр-H
/--with-filename
. В противном случае это изменит форматирование выходных данных при условии, что в результатах поиска будет только одно имя файлаfind
. Это примечательно, потому что это не кажется необходимым, если использоватьgrep
собственный поиск файлов (с-r
опцией).... Еще лучше включить
/dev/null
первый файл для поиска. Это решает две проблемы:grep
будет думать, что их два, и использовать режим вывода нескольких файлов.grep
будет думать, что есть один файл и не зависает в ожидании на стандартный ввод.Итак, окончательный ответ:
источник
find
в подстановке команд. Это прерывается, если есть имена файлов, содержащие пробелы или другие специальные символы. Используйтеfind -exec
, это надежный и простой в использовании.find -iname "*target*" -or -name 'exclude' -prune
. Ну, это вроде как работает - сокращенный каталог будет указан, но не найден. Если вы не хотите его в список, вы можете добавить свой род излишнего! -name 'exclude'