Поиск файлов и имен файлов с использованием искателя серебра
Используя 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 $