Подтвердить что ты не робот

Ack пропускает результаты (против grep)

Я уверен, что не понимаю что-то о файле/директории ack игнорировать значения по умолчанию, но, возможно, кто-то может пролить свет на это для меня:

mbuck$ grep logout -R app/views/
Binary file app/views/shared/._header.html.erb.bak.swp matches
Binary file app/views/shared/._header.html.erb.swp matches
app/views/shared/_header.html.erb.bak: <%= link_to logout_text, logout_path, { :title => logout_text, :class => 'login-menuitem' } %>
mbuck$ ack logout app/views/
mbuck$

В то время как...

mbuck$ ack -u logout app/views/
Binary file app/views/shared/._header.html.erb.bak.swp matches
Binary file app/views/shared/._header.html.erb.swp matches
app/views/shared/_header.html.erb.bak
98:<%= link_to logout_text, logout_path, { :title => logout_text, :class => 'login-menuitem' } %>

Просто вызов ack без параметров не может найти результат в файле .bak, но вызов с помощью параметра --unrestricted может найти результат. Однако, насколько я могу судить, ack не игнорирует файлы .bak по умолчанию.

UPDATE

Благодаря полезным комментариям ниже, вот новое содержимое моего ~/.ackrc:

--type-add=ruby=.haml,.rake
--type-add=css=.less
4b9b3361

Ответ 1

ack отличается тем, что не имеет черного списка игнорируемых типов файлов, а скорее белого списка типов файлов, в которые он будет искать.

Процитировать с man-страницы:

Без выбора файла ack-grep выполняет поиск файлов только тех типов, которые он распознает. Если у вас есть файл с именем foo.wango, а ack-grep не знает, что такое .wango файл, ack-grep не будет его искать.

(Обратите внимание, что я использую Ubuntu, где двоичный код называется ack-grep из-за конфликта имен)

ack --help-types отобразит список типов, поддерживаемых установкой ack.

Ответ 2

Если вы когда-либо смущены тем, какие файлы будут искать, просто добавьте опцию -f. Он отобразит все файлы, которые, по его мнению, будут доступны для поиска.

Ответ 3

ack --man:

Если вы хотите, чтобы ack искал каждый файл, даже те, которые он всегда игнорирует coredumps и резервные файлы, используйте Переключатель "-u".

и

Почему ack игнорирует неизвестные файлы по умолчанию? ack разработан программист, для программистов, для поиск больших деревьев кода. Наиболее кодовые базы содержат в них много файлов какие исходные файлы arent (например, скомпилированные объектные файлы, контроль источника метаданные и т.д.), а grep очень много отходов времени, просматривающего все эти а также возвращения матчей из эти файлы.

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

EDIT: Также, если вы посмотрите на исходный код, файлы bak игнорируются.

Ответ 4

Вместо борьбы с ack вы можете использовать простой старый grep с 1973 года. Поскольку он использует явно вложенные в черный список файлы, а не белые типы файлов, он никогда не пропускает правильные результаты. Учитывая пару строк конфигурации (которые я создал в моем домашнем каталоге "dotfiles" repo еще в 1990-х годах), grep на самом деле соответствует или превосходит многие из заявленных преимуществ - в частности, скорость: при поиске одного и того же набора файлов grep быстрее, чем ack.

Конфигурация grep, которая делает меня счастливой, выглядит так: в моем .bashrc:

# Custom 'grep' behaviour
# Search recursively
# Ignore binary files
# Output in pretty colors
# Exclude a bunch of files and directories by name
# (this both prevents false positives, and speeds it up)
function grp {
    grep -rI --color --exclude-dir=node_modules --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude-dir=.tox --exclude=tags "[email protected]"
}

function grpy {
    grp --include=*.py "[email protected]"
}

Точный список файлов и каталогов для игнорирования, вероятно, будет отличаться для вас: я в основном разработчик Python, и эти настройки работают для меня.

Также легко добавить подзадачи, поскольку я показываю для своего "grpy", который я использую для grep-источника Python.

Определение bash функций, подобных этому, предпочтительнее установки GREP_OPTIONS, что приведет к тому, что ВСЕ команды grep из вашей оболочки входа будут вести себя по-другому, в том числе вызванные программами, которые вы запускали. Эти программы, вероятно, будут зависеть от неожиданно различного поведения grep.

Мои новые функции, "grp" и "grpy", намеренно не тень "grep", так что я все еще могу использовать оригинальное поведение в любое время, которое мне нужно.