Что такое…

find или grep — какой командой искать и почему grep ищет полчаса

Иллюстрация: слева фонарь светит только на корешки книг, справа лупа скользит по страницам одной раскрытой книги

Ты ищешь, где в проекте объявлен компонент Checkout. Пишешь grep -r Checkout . и ждёшь. Терминал выплёвывает тысячи строк из node_modules, вентилятор воет, конца не видно.

А потом оказывается, что файл просто называется Checkout.tsx. Его можно было найти за долю секунды другой командой.

find и grep путают постоянно. Обе «ищут», обе живут в любом Linux и macOS. Но ищут они совсем разное. Разберёмся, какую когда брать, — и почему ИИ-агенты держат у себя обе.

Коротко: обложка или содержимое

Представь библиотеку.

  • find ходит вдоль полок и читает корешки: название, размер, дату. Внутрь книг не заглядывает.
  • grep открывает книги и читает страницы. Ищет нужную фразу в тексте.

Отсюда всё остальное. Знаешь, как называется файл, — тебе к find. Знаешь слово внутри файла — к grep.

find . -name "Checkout*"        # файлы, чьё имя начинается с Checkout
grep -rn "function Checkout" .  # строки, где этот текст встречается

Сравнение по пунктам

Что ищет

  • find — файлы и папки по имени, типу, размеру, дате изменения.
  • grep — строки текста внутри файлов.

Что возвращает

  • find — список путей: ./src/Checkout.tsx.
  • grep — путь, номер строки и саму строку: src/api.ts:42: function Checkout(). С флагом -l — только имена файлов.

Скорость

  • find — быстро. Он не открывает файлы, а только смотрит в каталог.
  • grep — медленнее. Он читает каждый байт каждого файла. В проекте с node_modules это сотни мегабайт.

Главная ловушка

  • find — шаблон без кавычек. find . -name *.js оболочка раскроет раньше, чем find его увидит, и поиск сломается. Пиши "*.js" в кавычках, по той же причине, что в разборе почему скрипт ломается на пробелах.
  • grep — поиск по всему подряд, включая зависимости, сборку и .git. Отсюда полчаса и тысячи мусорных строк.

Что может ещё

  • find — искать по возрасту и размеру: find . -size +100M найдёт гигантские файлы, find . -mtime -1 — изменённые за сутки.
  • grep — искать по регулярному выражению, без учёта регистра (-i), с контекстом вокруг (-C 3).

Как их совместить

Самые полезные поиски — это обе команды сразу. «Найди слово, но только в TypeScript-файлах»:

grep -rn --include="*.ts" "Checkout" src/

«Найди логи за сегодня, где была ошибка»:

find logs/ -name "*.log" -mtime -1 -exec grep -l "ERROR" {} +

Здесь find отбирает файлы по имени и дате, а -exec отдаёт их grep на чтение. Тот же трюк с -exec пригодится, когда нужно переименовать много файлов или сделать с ними что-то ещё.

И главное — не ищи там, где не надо:

grep -rn "Checkout" . --exclude-dir={node_modules,.git,dist}

Что поставить вместо них

У обеих команд есть современные версии: fd вместо find и rg (ripgrep) вместо grep. Они по умолчанию пропускают всё, что в .gitignore. То есть node_modules и сборку не трогают вообще. И работают в разы быстрее.

Смотри, интересная деталь: в Claude Code у агента есть ровно два инструмента поиска. Glob ищет файлы по шаблону имени — это find. Grep ищет текст внутри, и под капотом у него ripgrep. Когда агент «исследует проект», он делает то же, что ты: сначала смотрит корешки, потом открывает нужные книги. Больше про поиск в больших кодовых базах — в статье как найти код в большом проекте.

Кому что подойдёт

  • Ищешь файл и помнишь хоть кусок имени — find (или fd). Это быстрее всего.
  • Ищешь, где в коде используется функция, текст ошибки, ключ API — grep -rn (а лучше rg).
  • Ищешь текст, но только в файлах определённого типа или свежести — find + grep вместе или grep --include.
  • Работаешь с проектом на Node или Python каждый день — поставь rg и fd и забудь про --exclude-dir.

Если сомневаешься — начни с grep -rl: он покажет только имена файлов с совпадениями. Список коротких путей читать проще, чем простыню строк.

Почему grep пишет «binary file matches»?

Совпадение нашлось в файле, который не похож на текст: картинке, архиве, скомпилированном коде. grep не печатает такую строку, чтобы не залить экран мусором. Флаг -I пропускает такие файлы совсем.

Как найти файл, если не помнишь регистр букв?

Используй -iname вместо -name: find . -iname "readme*" найдёт и README.md, и readme.txt.

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →