Классическая утилита поиска файлов честно служит десятилетиями, но её синтаксис остался памятником своей эпохе: имя поиска пишется с ключом и кавычками, исключения задаются логическими скобками, и даже простая операция выглядит как маленькая программа. Современный наследник перевернул порядок: что ищем пишется первым, а остальное подстраивается умолчаниями. Результаты появляются быстрее, команды читаются как фразы, и девять из десяти повседневных поисков сокращаются до нескольких символов. Статья разбирает синтаксис, умные умолчания, фильтры, выполнение команд, честные границы замены классики и связки с соседними инструментами.
Синтаксис от простого к продвинутому за минуту
Базовая форма читается как предложение: что ищем, где ищем. Паттерн стоит первым аргументом, каталог вторым, а без второго поиск идёт от текущего места:
fd nginx
fd config /etc
Шаблон по умолчанию это не точное имя, а выражение: подстрока, начало, конец имени, гибкая маска. Для любителей классических масок есть режим глобов, а для точных имён режим полного соответствия. Умолчание выбрано по практике: чаще ищут по фрагменту имени, чем по точной записи, и первый же запуск обычно даёт то, что нужно.
Фильтры добавляются короткими ключами без синтаксического багажа: по расширению, по типу файла или каталога, по глубине вложенности, по скрытости. Каждый фильтр это одна буква с аргументом, и комбинации читаются слева направо без логических скобок. Сравните с классикой, где тот же список условий занимает строку втрое длиннее и требует точного порядка ключей.
Ограничение глубины в одну клавишу закрывает частый сценарий: найти в текущем каталоге без спуска в глубины подкаталогов. Классика требует явного указания максимальной глубины с полным именем ключа, наследник делает это аргументом из одного символа. Мелочь, но именно из таких мелочей складывается скорость набора мысли.
Умные умолчания от регистра до правил игнорирования
Первое умолчание, которым наследник берёт сердце пользователя: умный регистр. Поиск строчными буквами ищет без учёта регистра, появление заглавной буквы включает точный регистр. В классике регистр это всегда явный ключ, и половина поисков в повседневности страдает либо от избыточной строгости, либо от забытого ключа. Умное умолчание угадывает намерение в большинстве случаев, и уточнение требуется редко.
Второе умолчание, дающее скорость: уважение к правилам игнорирования. В каталоге с хранилищем версий наследник пропускает игнорируемые файлы и каталоги, которые составляют львиную долю мусора рабочего дерева: временные артефакты, собранные библиотеки, каталоги зависимостей. Поиск по проекту мгновенно получает два выигрыша: скорость, потому что проходить меньше, и релевантность, потому что в результатах нет тысячи файлов из каталога сборки.
Обход этих умолчаний честен и явен: ключи включают скрытые файлы, отключают уважение к правилам игнорирования, выводят всё подряд как классика. Авторы не прячут управление, они лишь выбирают точку отсчёта, соответствующую девяти сценариям из десяти, и это правильный выбор точки.
Цветной вывод завершает картину: найденное подсвечивается, каталоги отличимы от файлов, и глазу не нужно всматриваться в результаты. Классика монохромна, и при сорок третьем поиске за день это уже не мелочь, а усталость.
Вывод строится относительно точки поиска, и пути читаются как адреса, а не как хвост абсолютной строки. Для конвейеров ниже есть режим абсолютных путей, и переключение одной клавишей честно меняет форму вывода под потребителя: людям относительные, скриптам абсолютные.
Фильтры по типу времени и глубине поиска
Фильтр по расширению заслуживает отдельной похвалы за форму: одна клавиша с аргументом, и расширения перечисляются как есть, без точек и кавычек. Поиск всех журналов в дереве умещается в несколько символов, а перечисление нескольких расширений в один вызов покрывает комбинированные случаи.
Временные фильтры закрывают сценарии обслуживания: что изменилось за последние сутки, что не трогали месяц. Ключи формулируются по-человечески: изменившиеся в пределах окна, старше окна, и окно задаётся живым форматом вроде пары часов или семи дней. Для чистки временных файлов и ревизии свежих изменений это ровно те вопросы, которые задаются словами.
fd -e tmp --changed-within 2d
fd -e log -x rm {}
Типовая фильтрация дополняет набор: только каталоги, только файлы, только исполняемые, только ссылки. Выборка каталогов для обхода, выборка исполняемых для ревизии прав читается одной клавишей без комбинаций классики. Глубина ограничивает поиск сверху, и это второй по частоте фильтр после расширения в повседневной работе.
Полный путь как объект поиска закрывает сложные случаи: когда известна часть пути, а не имени. Ключ переключает сопоставление на весь путь, и структура каталогов становится частью запроса. Классика решает это регулярным выражением на весь путь, наследник делает это режимом, и разница в удобстве типична для всей пары инструментов.
Комбинирование фильтров раскрывает силу короткого синтаксиса: расширение плюс глубина плюс тип умещаются в одну строку и остаются читаемыми вслух. Классическое выражение той же задачи потребует ключей с полными именами и, скорее всего, будет понятно только автору на второй день. Чем короче путь от намерения до команды, тем чаще поиск используется, и именно это делает повседневную ревизию привычкой, а не подвигом.
Выполнение команд над найденным
Наследник не ограничивается поиском: над каждым найденным можно выполнить команду, с подстановкой пути в нужное место. Два режима покрывают два стиля: выполнить команду для каждого файла отдельно или собрать группы путей в один вызов для экономии запусков:
fd -e jpg -X convert -quality 85
fd -e gz -x gzip -t
Режим группировки передаёт команде пачку путей, когда она умеет принимать списком, и массовые операции выполняются за считанные запуски вместо тысяч. Режим по одному оставляет контроль каждому файлу и годится для команд с индивидуальным результатом. Выбор между режимами это выбор между скоростью и контролем, и оба под рукой.
Подстановки в команде гибкие: сам путь, имя без каталога, имя без расширения, родительский каталог. Для команд, которым нужны части пути, это устраняет строительные леса из подстановок оболочки, и команда читается как есть.
Практический набор подстановок закрывает и параллельность: ключ задаёт число одновременных выполнений, и массовые операции над тысячами файлов используют ядра по назначению. Классика с отдельной утилитой сборки аргументов делает то же самое длиннее, а связка наследника с параллельным исполнителем короче, и обе формы стоят в арсенале.
Осторожность та же, что и всюду с выполнением команд: холостой прогон с показом того, что будет выполнено, перед боевой чисткой. У наследника это не режим, а культура пользователя, и лучшая привычка здесь экономит больше, чем все умные умолчания вместе.
Честное сравнение с классикой и границы замены
Скорость сравнения честна и предсказуема: на рабочих деревьях с правилами игнорирования наследник быстрее, потому что меньше проходит; на полных проходах большой файловой системы разница сжимается, потому что пропускать нечего. Утверждения о кратных выигрышах справедливы именно для деревьев проектов, и в этом классическом сценарии разработки выигрыш реален и заметен без секундомера.
Классика сохраняет права гражданства там, где нужны её уникальные возможности: сложные предикаты с логикой, точные права, владельцы, комбинации времени с минутными границами, атомарные операции с файлами по статусу. Наследник покрывает повседневность, классика остаётся инструментом тонких работ, и опытные пользователи держат обе, выбирая по форме задачи.
Портативность это козырь классики: она есть везде, от встраиваемых систем до спасательных носителей, и сценарий "найти на чужой машине без установки" решает только она. Наследник устанавливается из репозиториев современных дистрибутивов без усилий, но факт остаётся фактом: там, где ничего нельзя поставить, работает только классика.
Читаемость это козырь наследника: команды короче, умолчания угадывают намерение, результаты релевантнее. В команде, где поиски делятся в чат и попадают в документацию, разница между двумя формами одной операции влияет на то, будет ли операция понята с первого прочтения.
Установка из репозиториев современных дистрибутивов тривиальна, и вес инструмента скромен: он не тянет за собой экосистему зависимостей и работает как один исполняемый файл. Для команд с общими настройками рабочих мест установка включается в базовый набор утилит, и через месяц вся команда пишет поиски в одной и той же короткой форме, понимая друг друга с первого взгляда.
Связки с другими инструментами рабочего стола
Наследник дружит с соседями по рабочему столу, и связки умножают его ценность. Вывод подаётся в нечёткий поиск для интерактивного выбора файла из сотен найденных, и связка из двух утилит превращает поиск в прыжок: набрал фрагмент, выбрал из подсказок, оказался в нужном месте. Для ежедневной навигации это замена cd с папками закладок.
Вывод подаётся в редакторы и файловые менеджеры как список кандидатов, и перечисленные расширения открываются выбранной программой. Поиск журналов с последующей отправкой в просмотрщик умещается в одну строку, и сценарий "найди и покажи" живёт без промежуточных переменных.
Скрипты получают наследника как генератор списков: что искали глазами, теперь идёт в цикл оболочки, и пары строк достаточно для прохода по найденному. Псевдонимы собирают личные формы: частые поиски по расширению с типами файлов живут под короткими именами, и арсенал растёт без роста сложности.
Связка с классическим потреблением унаследована без потерь: режимы печати полного списка, режим без цвета для конвейеров, счёт найденного одной строкой. Наследник понимает, что его вывод читают и люди, и программы, и форма вывода выбирается под читателя клавишей, а не отдельной утилитой.
Ограничение связок честно: они требуют установки обоих участников, и на аскетичных системах распадаются до классики. Зато на рабочей машине, где всё своё, связки делают поиск файловой системой с адресной строкой.
Рабочие сценарии применения в ежедневных делах
Сценарии, где наследник раскрывается полностью, выглядят так:
- Поиск по фрагменту имени в дереве проекта с пропуском мусора сборки;
- Выборка по расширению или типу для ревизий и чисток;
- Массовые операции с подстановкой пути и параллельным выполнением;
- Поиск изменившегося за окно времени для ревизии свежих правок;
- Интерактивный выбор найденного через нечёткий поиск;
- Генерация списков для скриптов без ручного прохода по дереву.
За списком стоит сдвиг парадигмы: поиск перестал быть командой с ключами и стал фразой с уточнениями. Инструмент, который угадывает регистр, уважает правила проекта и подкрашивает результаты, стирает разрыв между мыслью "где же тот файл" и ответом.
Итоговое суждение спокойное. Наследник не отменяет классику, он забирает у неё повседневность, и это правильное разделение труда: тонкие предикаты и аскетичные системы остаются за старым инструментом, а скорость и читаемость повседневных поисков переходят к новому.
Практический совет по переучиванию: неделю стоит запретить себе классику на рабочей машине и переводить каждый поиск в новую форму. Мышечная память переезжает за несколько дней, и возврат к длинным ключам классики после этого ощущается как печать на пишущей машинке: возможно, но незачем. Установка одной утилиты и неделя привычки окупаются экономией секунд на каждом поиске, а поисков у администратора и разработчика десятки в день, и это самая дешёвая инвестиция из всех возможных в собственной скорости.
Мелкая привычка с большим эффектом: частые поиски получают псевдонимы в файле настроек оболочки. Пять коротких команд покрывают пятнадцать поисков в день, и мускулы памяти забирают у клавиатуры то, что ей не принадлежит.