Как исключить определенный файл из ack (ack-grep)?

С обычной командой grep есть опция --exclude (подробно описанная здесь: Используйте синтаксис grep --exclude / - include, чтобы не просматривать определенные файлы с помощью grep), который позволяет игнорировать определенные файлы при использовании grep.

Параметр Ack --type заботится о 95% случаев, когда вы хотите исключить файлы, но он (насколько я могу судить) не обрабатывает случай исключения определенного файла. У меня есть скомпилированный JS-файл, в котором содержится содержимое всех остальных JS-файлов (в одной строке), поэтому каждый раз, когда я ищу что-нибудь, я возвращаю все содержимое этого скомпилированного гигантского файла. файл.

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


ack
person machineghost    schedule 24.07.2012    source источник


Ответы (5)


Нет, ack 1.x не позволит вам исключить отдельный файл. В ack 2.0 это возможно. ack 2.0 в настоящее время находится в первой альфа-версии теперь является текущей рекомендуемой версией ack.

Что касается вашего конкретного случая минифицированного файла Javascript, какую версию ack вы используете? ack 1.96 должен игнорировать минимизированный JavaScript на основе расширения. Если проверка расширений не работает, вы, вероятно, можете взломать сам ack, поскольку это единственная программа на Perl. Вы можете взломать функцию is_searchable.

В ack 2.0 мы смотрим на игнорирование любой строки длиной, скажем, 500 символов, потому что это явно не исходный код.

Вы также можете присоединиться к нам в списке рассылки ack-users. Мы довольно отзывчивы.

person Andy Lester    schedule 24.07.2012
comment
Фактически, моей следующей остановкой должен был стать список рассылки ack, но я решил сначала проверить здесь, чтобы убедиться, что я не упускаю что-то очевидное :-) Спасибо, Энди. - person machineghost; 25.07.2012
comment
P.S. Я выбираю имя для своего скомпилированного файла JS, поэтому на данный момент это просто build.js. Я попробую переименовать его в built.min.js и посмотрю, поможет ли это. - person machineghost; 25.07.2012

Чтобы игнорировать отдельный файл с помощью ack 2.0, укажите спецификацию фильтра для флага --ignore-file:

--ignore-file=is:cljout.js

person jbouwman    schedule 14.06.2013
comment
Что is: здесь делает? - person Explosion Pills; 15.01.2014
comment
Точное совпадение имени файла. yondgrep.com/documentation/ack-2.04-man.html#is_filename - person Paul Bissex; 11.02.2014
comment
Это работает для меня с именами файлов, но не если я хочу указать конкретный файл (т.е. путь и имя файла). - person tremby; 07.03.2014
comment
Как указать несколько? - person Steven Lu; 24.03.2015
comment
Вы можете использовать match вместе с регулярным выражением для сопоставления имен файлов и ext для расширений. Исключить файлы js --ignore-file=ext:js. Исключить файлы с именами foo и bar --ignore-file='match:/foo|bar/'. В случае регулярного выражения с | следует экранировать параметр кавычками, чтобы оболочка не выполняла его как конвейер. - person xtreak; 26.09.2015
comment
Все это is: так неочевидно и раздражает - person Steven Lu; 08.12.2015
comment
Не упрощает разделение пути, например было бы полезно использовать другой разделитель: --ignore-file='match:#path/to/thing/whatever.ext#' - person opyate; 28.11.2017
comment
Для тех, кто находит синтаксис --ignore-file слишком awkward, вы можете использовать что-то вроде этого: REGEX='find.*stuff'; ack "$REGEX" -l | ack -v bad_file | ack --files-from - "$REGEX", который будет искать и выводить только имена файлов, затем отфильтровывает имена файлов со словом 'bad_file', а затем снова выполняет поиск только в оставшихся файлах - person user986730; 13.06.2019

Если вы запустите ack --create-ackrc, он выведет целую кучу предустановок для общих файлов, таких как минимизированный javascript, css, и таких каталогов, как node_modules и .git. Очень полезно!

Вот вариант минифицированного js:

# minified Javascript
--ignore-file=match:/[.-]min[.]js$/
--ignore-file=match:/[.]js[.]min$

А вот как игнорировать каталог с именем foo:

--ignore-directory=is:foo

Если вы хотите сохранить это в .ackrc, запустите

ack --create-ackrc >> ~/.ackrc

а затем удалите из этого файла то, что вам не нужно.

Кроме того, вы можете создать еще один .ackrc файл в корневой папке вашего проекта для конкретных материалов проекта. Я поместил это в .gitignore, чтобы он не загромождал репо.

person Rimian    schedule 30.06.2017
comment
Я считаю, что --ignore-directory не принимает фильтры типа is:, как --ignore-file. --ignore-directory принимает только имя каталога. - person Julian Mehnle; 08.04.2021

Если вы хотите исключить конкретную папку, вам может помочь следующая команда:

ack keywords --ignore-dir folder_name

man ack предоставит более подробную информацию :)

- [no] ignore-dir = DIRNAME, - [no] ignore-directory = DIRNAME

--ignore-file = FILTERTYPE: FILTERARGS

person Yihe    schedule 13.05.2018

Также полезно знать, что с ack2.0 вы можете указать эти параметры в .ackrc файле < / a>, если вам нужно часто фильтровать файлы.

person akotian    schedule 27.06.2016