Продолжаем серию про утилиты, переписанные на 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
