Я хотел бы использовать «поиск» и «найти» для поиска исходных файлов в моем проекте, но они требуют много времени для запуска. Существуют ли более быстрые альтернативы этим программам, о которых я не знаю, или способы повышения производительности из этих программ?
22
locate
должно быть уже достаточно быстрым, учитывая, что он использует предварительно созданный индекс (основной оговоркой является то, что он должен быть в курсе), в то время какfind
должен читать списки каталогов.find /usr/src -name fprintf.c
на своем настольном компьютере OpenBSD, он возвращает расположение этих исходных файлов менее чем за 10 секунд.locate fprintf.c | grep '^/usr/src.*/fprintf.c$'
возвращается через секунду. Каково ваше определение «долго бежать» и как вы используетеfind
иlocate
?Ответы:
Поиск исходных файлов в проекте
Используйте более простую команду
Как правило, исходный код проекта, вероятно, находится в одном месте, возможно, в нескольких подкаталогах, вложенных не более чем в две или три глубины, поэтому вы можете использовать (возможно) более быструю команду, такую как
Используйте метаданные проекта
В C-проекте у вас обычно есть Makefile. В других проектах у вас может быть что-то подобное. Это может быть быстрым способом извлечения списка файлов (и их местоположения), написания скрипта, который использует эту информацию для поиска файлов. У меня есть «исходный» скрипт, чтобы я мог писать такие команды, как
grep variable $(sources programname)
.Ускорение найти
Ищите меньше мест, а не
find / …
используйтеfind /path/to/project …
там, где это возможно. Упростите критерии выбора, насколько это возможно. Используйте конвейеры, чтобы отложить некоторые критерии выбора, если это более эффективно.Также вы можете ограничить глубину поиска. Для меня это значительно повышает скорость поиска. Вы можете использовать ключ -maxdepth. Например, '-maxdepth 5'
Ускорение найти
Убедитесь, что он индексирует интересующие вас местоположения. Прочтите справочную страницу и используйте любые параметры, подходящие для вашей задачи.
Убрать необходимость поиска
Может быть, вы ищете, потому что вы забыли, где что-то или не было сказано. В первом случае пишите заметки (документацию), во втором спрашивайте? Соглашения, стандарты и последовательность могут очень помочь.
источник
Я использовал «ускорение поиска» части ответа RedGrittyBrick. Я создал меньшую БД:
затем указал
locate
на это:locate -d /home/benhsu/ben.db
источник
Тактика, которую я использую, заключается в применении
-maxdepth
опции сfind
:Повторяйте с увеличением глубины, пока не найдете то, что ищете, или устали смотреть. Первые несколько итераций, вероятно, вернутся мгновенно.
Это гарантирует, что вы не тратите время впустую, просматривая глубины массивных поддеревьев, когда то, что вы ищете, с большей вероятностью будет находиться у основания иерархии.
Вот пример сценария для автоматизации этого процесса (Ctrl-C, когда вы видите, что вы хотите):
Обратите внимание, что связанная с этим избыточность (каждый проход должен проходить через папки, обработанные в предыдущих проходах) будет в значительной степени оптимизирована за счет кэширования диска.
Почему
find
этот порядок поиска не встроен? Возможно, потому что это было бы сложно / невозможно реализовать, если вы предполагали, что избыточный обход недопустим. Наличие-depth
опции намекает на возможность, но увы ...источник
Другое простое решение - использовать более новую расширенную оболочку. Включить:
Затем вы можете запускать такие команды в исходном каталоге верхнего уровня:
Это имеет то преимущество, что он рекурсивно просматривает все подкаталоги и работает очень быстро.
источник
Серебряный Искатель
Вы можете найти его полезным для очень быстрого поиска содержимого огромного количества файлов исходного кода. Просто введите
ag <keyword>
. Вот некоторые из моих выводовapt show silversearcher-ag
:Я обычно использую это с:
источник
.gitignore
файлы и пропуски.git
,.svn
,.hg
.. папки..gitignore
и игнорирует скрытые и бинарные файлы по умолчанию. Также есть больше участников, больше звезд на Github (14700 против 8300) и уже на репо мэров дистрибутивов. Пожалуйста, предоставьте обновленное сравнение достоверных сторонних источников. Тем не менее,ripgrep
выглядит отличный кусок программного обеспечения.ripgrep
никоим образом не связан с автором (ами) , это просто соответствует моим требованиям, поэтому я перестал искать другие варианты..gitignore
тоже уважает . Тем не менее,rg
это совершенно потрясающе. Во-первых, он поддерживает Unicode. По моему опыту,rg
по крайней мере, вдвое быстрее, чемag
(YMMV), я предполагаю, что это из-за синтаксического анализатора регулярных выражений Rust, который, очевидно, еще не был готов, еще в те годы онag
был новым.rg
может выдавать детерминированный вывод (но не по умолчанию), он может заносить в черный список типы файлов, гдеag
может быть только белый список, он может игнорировать файлы в зависимости от размера (до свидания, журналы). Я все еще используюag
в случае, если мне нужно многострочное сопоставление, чтоrg
не может сделать.Для замены найти, проверьте FD . Он имеет более простой / более интуитивно понятный интерфейс, чем оригинальная команда поиска, и немного быстрее.
источник