Может проверять поиск только по файлам, которые соответствуют определенному шаблону 'glob' (например: поиск foo во всех файлах с именем "bar * .c"). Команда
ack foo "bar*.c"
работает только в текущем каталоге.
Примечание: я знаю, что это возможно с помощью команды find -exec:
find . -name "bar*.c" -type f -exec ack foo {} +
Но я бы хотел маленькую и простую команду ack, потому что find не пропускает каталоги контроля версий.
find . -name "bar*.c" -exec ack foo {} \;
? В этом нет ничего особенногоgrep
, вы можете использовать любую команду с find-exec
.Ответы:
Поиск в каталогах
Основываясь на кратком описании, показанном на странице руководства, я бы сказал, что он может обрабатывать каталог, но, глядя на переключатели, он не может искать только файл, основанный на шаблоне. Для этого вам придется заручиться
find
. Командаack
включает параметр,--files-from=FILE
чтобы можно было получать список файлов изfind
.конспект
использование
Есть
--ignore-file=
вариант, который может дать вам то, что вы хотите, но на самом деле кажется немного трудным для использования.Поиск определенных типов файлов
Единственный другой способ, которым я могу представить,
ack
- это использовать его--type
переключатель:Чтобы увидеть, какие типы доступны:
формат. Например, оба --type = perl и --perl работают. - [нет] cpp .cpp .cc .cxx .m .hpp .hh .h .hxx - [нет] objcpp .mm .h - [нет] perl .pl .pm .pod .t .psgi; первая строка соответствует /^#!.*\bperl/ - [нет] perltest .t
Примеры
Найдите все файлы Perl на основе имени файла (* .pm, * .pl, * .t и * .pod) и строки shebang.
Найдите все файлы C ++:
Поиск foo в баре * .c
Итак, как же вы можете достичь того, что вы хотите? Ну, вам, вероятно, придется использовать
find
это:Вы также можете использовать
ack
возможность поиска файлов, которые соответствуют заданному шаблону в их именах файлов (с использованием-g <pattern>
), а затем передать этот список во второй вызовack
использования-x
или--files-from=-
..Использование
-x
:Использование
-files-from=-
:В любом случае мы сопоставляем имена файлов, которые вы хотите использовать с помощью этого регулярного выражения:
Это соответствует файлам , чье имя
bar.*c
и конец после того , как с.c
помощью конца строки якоря$
. Мы также стремимся убедиться, что имена имеют ограничивающий символ, используя\b
. Это не удастся для файлов, которые содержат граничные символы, такие как, например,$bar.c
или%bar.c
.источник
cpp
файловack --type=cpp <string>
. См.ack
Справочную страницу для получения дополнительной информации обо всем этом. Но я в основном говорю вам, что вы не можете искать, используяack
тот путь, который хотите.ack
не может делать то, что просили.find adir -iname "bar*.c" | ack --files-from=- foo
. Или, если вы просто хотите один файл:echo "barBaz.c" | ack --files-from=- foo
ack -g '\bbar.*.c$' | ack -x foo
Это легко, если тип файла известен, и ack знает много типов файлов. Так что, если, например, вы хотите искать только в файлах C, вы можете сделать:
Но если это не одно из известных расширений, вам нужно определить свой собственный тип. Это должно работать:
Обратите внимание, что вам нужны и --type-set, и --barc.
(Спасибо Энди, который также помог с этим в списке рассылки.)
источник
man ack
на самом деле не помогает и не имеет,cc
когда я ищу это."Что нового в Ack 2?" http://beyondgrep.com/ack-2.0/
Только я не могу заставить его работать
Таким образом, кажется, -g нужно регулярное выражение, в то время как я хочу опцию стиля 'glob' ...
источник
-g
принимает регулярное выражение, а не шар. Вы можете написать свое регулярное выражение как.*bar.*\.c$
.Это может показаться самым быстрым и безопасным:
-x Прочитать список файлов для поиска из STDIN.
Однако, если файл, скорее всего, будет в вашей
locate
базе данных, это будет еще быстрее:Locate также может принимать регулярные выражения старой школы, немного болезненно, но если вы ищете
c
файлы, это может потребоваться. напримерЭто просто переводится как: «искать все имена файлов, оканчивающиеся на c, cpp, h, hpp или cc».
источник
Ack не поддерживает выбор файла в стиле glob. Так как я действительно скучаю по этому, я создал небольшой скрипт оболочки :
Теперь вы можете использовать команду:
Но обратите внимание: это, к сожалению, также будет искать в директориях контроля версий (например: .git).
источник
Это можно сделать с помощью
-G
опции ag, поисковика серебра (расширенный клон ack-grep).Примечания:
ag
использует синтаксис регулярных выражений PCRE , поэтомуbar.*\.c
вместоbar*.c
.-G
Вариант должен предшествовать слово для поиска, как что - либо после того, что интерпретируется как имя файла.источник
Вы хотите только определенный шаблон, или вы просто хотите исходные файлы C?
Если вы хотите все файлы C, используйте
Если вы хотите, чтобы все файлы C и НЕ заголовочные файлы C использовали
источник
Ответ @chim самый лучший, но написан как комментарий, поэтому я делаю репост как официальный ответ ...
Мне нравится тот факт, что вы можете пересмотреть путь ...
источник
Используя zsh вы можете сделать:
источник
ls
.