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
Ответы
Ответ 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", так что я все еще могу использовать оригинальное поведение в любое время, которое мне нужно.