ack пропускает результаты (против grep) - PullRequest
46 голосов
/ 14 июня 2010

Я уверен, что что-то неправильно понимаю в файле / каталоге 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

Ответы [ 4 ]

52 голосов
/ 14 июня 2010

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

Цитировать из справочной страницы:

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

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

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

13 голосов
/ 14 июня 2010

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

12 голосов
/ 14 июня 2010

ack --man состояния:

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

и

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

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

РЕДАКТИРОВАТЬ: Кроме того, если вы посмотрите на исходный код, bak файлы игнорируются.

5 голосов
/ 04 октября 2011

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

function grpy {
    grp --include=*.py "$@"
}

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

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

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

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

...