Продолжаем серию про утилиты, переписанные на Rust: после ls и cat очередь find. fd ищет файлы, но с умолчаниями, настроенными под реальную работу, а не под совместимость с POSIX-стандартом тридцатилетней давности.

Главное отличие — по умолчанию fd пропускает скрытые файлы (всё, что начинается с точки) и всё, что подпадает под .gitignore. Для репозитория с node_modules или target в игноре это значит, что поиск сразу идёт по полезным файлам, а не по мусору сборки:

fd config

Если нужно всё-таки залезть в скрытое или игнорируемое — -H/--hidden возвращает скрытые файлы, -I/--no-ignore — файлы из .gitignore, а -u/--unrestricted включает оба режима разом.

Синтаксис короче за счёт тех же умолчаний: там, где find требует явно указать путь и флаг -name, fd принимает просто паттерн и по умолчанию ищет от текущего каталога по имени файла (не по всему пути — для этого есть --full-path):

find . -iname "*.conf"
fd -e conf

-e/--extension тут фильтрует по расширению, что для find потребовало бы отдельного -name "*.conf" с учётом регистра через -iname.

Для действий над результатами — -x/--exec и -X/--exec-batch. Разница практическая: -x запускает команду отдельно для каждого найденного файла (параллельно), -X — один раз, передав все результаты единым списком аргументов:

fd -e log -x gzip
fd -e tmp -X rm

Для gzip каждого лога по отдельности логично взять -x — файлы сжимаются независимо. А вот rm или tar над набором файлов эффективнее запустить один раз через -X, не плодя процесс на каждый файл.

#rust #linux