16

Я хотел бы использовать "найти" и "найти" для поиска исходных файлов в моем проекте, но они требуют много времени для запуска. Существуют ли более быстрые альтернативы этим программам, о которых я не знаю, или способы повысить производительность этих программ?

5 ответов5

14

Поиск исходных файлов в проекте

Используйте более простую команду

Как правило, исходный код проекта, вероятно, находится в одном месте, возможно, в нескольких подкаталогах, вложенных не более чем в две или три глубины, поэтому вы можете использовать (возможно) более быструю команду, такую как

(cd /path/to/project; ls *.c */*.c */*/*.c)

Используйте метаданные проекта

В C-проекте у вас обычно есть Makefile. В других проектах у вас может быть что-то подобное. Это может быть быстрым способом извлечения списка файлов (и их местоположения), написания скрипта, который использует эту информацию для поиска файлов. У меня есть скрипт "sources", так что я могу писать команды, такие как grep variable $(sources programname) .

Ускорение найти

Ищите меньше мест, вместо find / … используйте find /path/to/project … где это возможно. Упростите критерии выбора, насколько это возможно. Используйте конвейеры, чтобы отложить некоторые критерии выбора, если это более эффективно.

Также вы можете ограничить глубину поиска. Для меня это значительно повышает скорость поиска. Вы можете использовать ключ -maxdepth. Например, '-maxdepth 5'

Ускорение найти

Убедитесь, что он индексирует интересующие вас места. Прочитайте справочную страницу и используйте любые параметры, подходящие для вашей задачи.

   -U <dir>
          Create slocate database starting at path <dir>.

   -d <path>
          --database=<path> Specifies the path of databases to search  in.


   -l <level>
          Security  level.   0  turns  security checks off. This will make
          searchs faster.   1  turns  security  checks  on.  This  is  the
          default.

Убрать необходимость поиска

Может быть, вы ищете, потому что вы забыли, где что-то или не было сказано. В первом случае пишите заметки (документацию), во втором спрашивайте? Соглашения, стандарты и последовательность могут очень помочь.

8

Я использовал часть "ускорения поиска" в ответе RedGrittyBrick. Я создал меньшую БД:

updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"

затем заостренные locate на него: locate -d /home/benhsu/ben.db

5

Тактика, которую я использую, заключается в применении опции -maxdepth с помощью find:

find -maxdepth 1 -iname "*target*"

Повторяйте с увеличением глубины, пока не найдете то, что ищете, или устали смотреть. Первые несколько итераций, вероятно, вернутся мгновенно.

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


Вот пример скрипта для автоматизации этого процесса (Ctrl-C, когда вы видите, что вы хотите):

(
TARGET="*target*"
for i in $(seq 1 9) ; do
   echo "=== search depth: $i"
   find -mindepth $i -maxdepth $i -iname "$TARGET"
done
echo "=== search depth: 10+"
find -mindepth 10 -iname $TARGET
)

Обратите внимание, что связанная с этим избыточность (каждый проход должен проходить через папки, обработанные в предыдущих проходах) будет в значительной степени оптимизирована за счет кэширования диска.

Почему не find этот порядок поиска в качестве встроенной функции? Возможно, потому что это было бы сложно / невозможно реализовать, если вы предполагали, что избыточный обход недопустим. Наличие опции -depth намекает на возможность, но увы ...

1

Другое простое решение - использовать более новую расширенную оболочку. Включить:

  • bash: shopt -s globstar
  • ksh: set -o globstar
  • zsh: уже включен

Затем вы можете запустить такие команды в каталоге исходного кода верхнего уровня:

# grep through all c files
grep printf **/*.c

# grep through all files
grep printf ** 2>/dev/null

Это имеет то преимущество, что он рекурсивно просматривает все подкаталоги и работает очень быстро.

1

Серебряный Искатель

Возможно, вы найдете это полезным для очень быстрого поиска содержимого огромного количества файлов исходного кода. Просто введите ag <keyword> . Вот некоторые из выводов моего apt show silversearcher-ag:

  • Упаковка: silversearcher-ag
  • Сопровождающий: Хадзимэ Мизуно
  • Домашняя страница: https://github.com/ggreer/the_silver_searcher
  • Описание: очень быстрая grep-подобная программа, альтернатива ack-grep Silver Searcher - это grep-подобная программа, реализованная C. Попытка сделать что-то лучше, чем ack-grep. Он ищет шаблон примерно в 3–5 раз быстрее, чем ack-grep. Он игнорирует шаблоны файлов из ваших .gitignore и .hgignore.

Скриншот

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .