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

836
ccpizza

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

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

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

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

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

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

2
Попробуйте [beagle] (https://faculty.washington.edu/browning/beagle/beagle.html) Ipor Sircer 6 лет назад 0

2 ответа на вопрос

2
ccpizza

Утилиты командной строки для поиска кода 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 
1
glallen

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

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

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

ack https://beyondgrep.com/

поиск без регулярных выражений в файле 9 ГБ занял менее 10 секунд (с `ripgrep`) - потрясающий результат для неиндексированного поиска! grep занимает минуты .. ccpizza 6 лет назад 0

Похожие вопросы