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.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





