Поиск файлов и имен файлов с использованием искателя серебра

Используя Silver Searcher, как я могу искать:

  • (небинные) файлы со словом или рисунком И
  • все имена файлов со словом или шаблоном, включая имена файлов двоичных файлов.

Другие предпочтения: хотели бы иметь регистр без учета регистра и поиск через dotfiles.


Пытался использовать псевдоним без особого успеха:

alias search="ag -g $1 --smart-case --hidden && ag --smart-case --hidden $1"

Ответы

Ответ 1

Согласно справочной странице ag

   -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

Вы можете использовать -G для поиска файлов, соответствующих шаблону.

Итак, чтобы ответить на ваш вопрос:

[email protected]:~/rpm-4.12.0.1# ag -G cpio.c size
rpm2cpio.c
21:    off_t payload_size;
73:    /* Retrieve payload size and compression type. */
76:     payload_size = headerGetNumber(h, RPMTAG_LONGARCHIVESIZE);

Команда выше ищет size слова во всех файлах, которые соответствуют шаблону cpio.c

Ссылка:
man-страница ag версии 0.28.0

Примечание 1:

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

Обе команды ниже ищут foo во всех файлах php:

find . -name \*.php -exec grep foo {}
ag --php foo

В то время как find + grep ищет все файлы .php, переключатель --php в команде ag фактически ищет следующие расширения файлов:

.php  .phpt  .php3  .php4  .php5  .phtml

Вы можете использовать --cpp для исходных файлов --hh, --hh для файлов .h, --js для JavaScript и т.д. И т.д. Полный список можно найти здесь.

Ответ 2

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

searchfunction() {
  echo $(ag -g $1 --hidden)
  echo $(ag --hidden -l $1)
}

alias search=searchfunction

Вы можете изменить этот пример в соответствии с вашими задачами несколькими способами, например

  • добавить/удалить флаг -l в зависимости от того, хотите ли вы, чтобы текстовые результаты отображали совпадение текста или просто имя файла
  • добавить заголовки для разделения результатов текста и результатов имени файла.
  • дедупликация результатов для учета файлов, которые соответствуют как именам файлов, так и текстам и т.д.

[Изменить: удалить ненужный флагом -smart-case по комментарию Пабло Бьянки]

Ответ 3

Попробуйте следующее:

find . | ag "/.*SEARCHTERM[^/]*$"

Команда find . отобразит все файлы.

Мы передаем вывод этого файла команде ag "/.*SEARCHTERM[^/]*$", которая соответствует SEARCHTERM, если она находится в имени файла, а не только полный путь.

Ответ 4

Нашел этот вопрос в поисках того же ответа сам. Не похоже, что у ag есть какая-либо собственная возможность поиска по именам файлов и каталогов. Ответы выше от Зака Фогга и Джикку Хосе оба работают, но трубопроводы find. может быть очень медленным, если вы работаете в большом каталоге.

Я бы порекомендовал использовать find напрямую, что намного быстрее, чем передать через ag:

Linux (GNU-версия find)

find -name [pattern]

OSX (версия BSD для find)

find [pattern]

Если вам нужна дополнительная помощь в find, это руководство от Digital Ocean довольно хорошее. Я включил это, потому что man-страницы для find являются чрезвычайно плотными, если вы просто хотите понять, как их использовать.

Ответ 5

Чтобы добавить к предыдущим ответам, вы можете использовать регулярное выражение "Или" для поиска в файлах, соответствующих различным расширениям файлов.

Например, чтобы просто найти строку в заголовочных файлах [ CN10 ] [ .hpp ] и Makefiles [ .mk ]):

ag -G '.*\.(hpp|mk)' my_string_to_search

Ответ 6

После неудовлетворенности mdfind, find, locate и другими попытками у меня сработало следующее. Он использует tree для получения начального списка файлов, ag для фильтрации каталогов, а затем awk для печати соответствующих файлов.

Я использовал tree потому что оно было (и более легко) настраиваемо, чем другие решения, которые я пробовал, и работает быстро.

Это функция рыбы:

function ff --description 'Find files matching given string'
  tree . --prune --matchdirs -P "*$argv*" -I "webpack" -i -f --ignore-case -p |
    ag '\[[^d].*' |
    awk '{print $2}'
end

Это дает вывод, подобный следующему:

~/temp/hello_world $ ff controller
./app/controllers/application_controller.rb
./config/initializers/application_controller_renderer.rb
~/temp/hello_world $