Более быстрый способ поиска по файлам, чем grepping?

Есть ли способ индексировать файл или файловое дерево из консоли, чтобы поиск подстрок можно было выполнять быстрее, чем простой поиск?

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

Я ищу простую консольную утилиту, которая будет работать аналогично locate/slocate/mlocate но вместо имен файлов будет индексировать содержимое файла с определенными типами MIME в настраиваемом месте.

Пока единственное решение, которое я нашел быстрее, это fgrep ограничен ANSI, а не UTF-8 (с https://stackoverflow.com/a/13913220/191246) - хотя он обеспечивает впечатляющее ускорение, он все еще слишком медленный для больших файлов. Я хотел бы знать, есть ли какой-нибудь "дешевый" способ создания индекса и поиска по нему.

Я рассматриваю свист как вариант, но это потребует дополнительного кодирования.

Меня не интересуют приложения для индексирования на системном уровне, такие как spotlight на mac или их аналоги из linux, поскольку я ищу что-то гранулярное на уровне файлов или подпапок.

2 ответа

Решение

Другие альтернативы, которые не требуют индекса, включают:

ripgrep https://blog.burntsushi.net/ripgrep/

ag он же серебряный искатель: https://geoff.greer.fm/ag/

ack https://beyondgrep.com/

Утилиты командной строки для поиска кода Google (написанные на Go) соответствуют описанному сценарию использования.

На Debian/ Ubuntu его можно установить с

sudo apt install codesearch

Чтобы скомпилировать из источника:

Если он еще не установлен, сначала установите среду golang и определите GOPATH переменная:

sudo mkdir -p /usr/local/go
sudo chown myusername /usr/local/go

## normally you'd put this in your ~/.bashrc
export GOPATH=/usr/local/go

## on ubuntu/debian:
sudo apt install golang

## on osx
brew install golang

Далее строим cindex а также csearch:

go get github.com/google/codesearch/cmd/...

После установки из источника у вас будет cindex а также csearch под вашим $GOPATH/bin - либо перенеси их куда-нибудь под твой $PATH или добавить $GOPATH/bin на ваш $PATH и обновите / перезапустите вашу оболочку.

использование

Индексируйте файл или папку:
cindex myproject_dir

Индекс будет создан в ~/.csearchindex,

Теперь вы можете искать по индексу:

csearch sausage-and-spam
Другие вопросы по тегам