Команда Linux fd: 10 способов поиска файлов в терминале
Программа fd является альтернативой команде find и может искать файлы в файловой системе с использованием различных шаблонов. Она имеет множество опций, поддерживающих широкий спектр сценариев использования, что позволяет легко находить любые типы файлов независимо от ваших требований.
Следующие примеры демонстрируют широкие возможности fd. Они включают базовый поиск, регулярные выражения, фильтрацию по типу файлов и многое другое.
Самый простой поиск: нахождение всех имен файлов, содержащих фиксированную строку
Это наиболее распространённый и базовый поиск, который вы будете выполнять регулярно: файлы, имена которых содержат определённую строку. То, что вы ищете, будет зависеть не только от ваших собственных соглашений по именованию, но и от общепринятых. Например:
fd readme
Эта команда найдет все файлы с именами, содержащими «readme», используя поиск без учета регистра. Например, это может включать:
- readme.md
- ПРОЧИТАЙТЕ МЕНЯ
- файл-с-readme.txt
- subdir/ПрочтиМеня
Обратите внимание, что это гораздо шире, чем стандартный поиск с помощью команды find, который чувствителен к регистру и ищет только точные совпадения строк. Простой find readme не найдет ни один из приведенных выше файлов; вот эквивалентный способ, который их найдет:
find -iname '*readme*'
Таким образом, fd гораздо проще использовать для базового случая — поиска файла с определённым текстом в названии.
Глобальный поиск: для точного совпадения имен файлов
Итак, fd по умолчанию не выполняет поиск с использованием глобальных шаблонов, но вы можете изменить это поведение, если вам нужен другой тип поиска. Например, если вы хотите найти только файлы, которые начинаются с «readme», попробуйте этот поиск:
fd --glob 'readme*'
Это всё ещё поиск без учёта регистра, но вы можете имитировать поведение поиска по умолчанию с помощью флага -s для чувствительности к регистру:
fd -gs 'readme'
Флаг -g является короткой записью для —glob, тогда как -s — для —case-sensitive. Это найдет все файлы с точным именем «readme» в текущей директории и всех поддиректориях:
Хорошо выработать привычку заключать ваш поисковый шаблон в кавычки. Это гарантирует, что любые специальные символы — такие как * — не будут интерпретированы оболочкой и не будут рассматриваться как нечто, отличное от части вашего поискового шаблона.
Обратите внимание, что результаты включают файлы в подкаталогах; шаблон глоба применяется только к имени файла, а не к полному пути. Используйте -p (—full-path), если вы хотите искать текст в полном пути каждого файла.
Вы можете использовать глоббинг для точного совпадения имён файлов, просто избегая использования любых глоб-символов. Таким образом, эквивалент команды find -name README в fd будет:
fd -gs README
Поиск с помощью регулярных выражений: нахождение всех файлов, начинающихся с даты
Помимо поиска по шаблонам glob, fd может находить файлы, имена которых соответствуют регулярному выражению. На самом деле, это поведение по умолчанию:
fd '^..[da]+..$'
Это позволит найти все файлы, имена которых содержат два символа, за которыми следует любое количество букв «d» или «a», а затем еще два символа. Например, это позволит обнаружить следующие файлы:
На данном этапе стоит задуматься о поведении fd в отношении чувствительности к регистру. По умолчанию поиски fd не являются ни чувствительными к регистру, ни нечувствительными — все гораздо сложнее. fd попытается разумно интерпретировать ваш поиск, исходя из наличия заглавных букв.
Например, fd ‘'^..[DA]+..$'’ выполнит поиск с учетом регистра, потому что шаблон содержит как минимум один символ в верхнем регистре. Таким образом, этот поиск вернет файл с именем «README», но не файл с именем «readme». Напротив, fd ‘'^..[da]+..$'’ не содержит символов в верхнем регистре, поэтому будет выполнен поиск без учета регистра, который найдет файлы с именами «README», «readme» и «ReAdMe».
Снова же, использование более сложных поисков на основе регулярных выражений будет зависеть от ваших собственных соглашений по именованию. Но есть применения и для многих распространённых случаев.
Вот пример, который найдёт все файлы с расширением Markdown, которое может быть «.markdown», «.mdown» или «.md».
fd '.(md|mdown|markdown)$'
Поиск файлов с определённым расширением
Поиск файлов по их расширению — это настолько распространённый случай, что в fd есть специальный режим для этого. Опция -e будет искать файлы с указанным расширением, вот так:
fd -e md
Это эквивалент команды fd '\.md$' и найдет все файлы с именем, которое заканчивается на «.md.»
Вы можете искать несколько расширений, повторяя опцию -e, поэтому вы можете найти все файлы markdown без необходимости использовать регулярное выражение:
fd -e md -e mdown -e markdown
Поиск каталогов вместо файлов
По умолчанию fd находит все типы файлов, включая каталоги, символические ссылки, исполняемые файлы и обычные файлы. Вы можете изменить это поведение с помощью опции -t, после которой сразу после нее требуется одна из следующих букв:
|
ф |
Обычный файл |
|
д |
Каталог |
|
л |
Символическая ссылка |
|
x |
Исполняемый |
|
е |
Пустой файл |
Обратите внимание, что некоторые из этих категорий могут пересекаться: например, файл (-f) может также быть пустым файлом (-e). Также имейте в виду, что -e найдет любые пустые директории, которые соответствуют критериям. Если вы хотите искать несколько типов, используйте опцию -t несколько раз. Например, чтобы найти директории и символические ссылки:
fd -td -tl foo
Поиск скрытых файлов с использованием -H
Скрытые файлы — это ещё один тип файлов, который поддерживает fd. По умолчанию он их игнорирует:
Однако, используя опцию -H, вы можете найти скрытые файлы, такие как .DS_Store на macOS:
fd -H .DS_Store
Это отличный вариант, если вы хотите удалить такие ненужные системные файлы, особенно если вы хотите автоматизировать этот процесс.
Вы также можете использовать это для поиска файлов .gitignore, которые содержат данные о файлах, которые git не должен рассматривать как часть репозитория:
fd -H .gitignore
Поиск файлов в репозиториях Git
Говоря о файлах .gitignore, fd будет использовать их для автоматической фильтрации игнорируемых файлов. Файлы .gitignore обычно используются для сгенерированных файлов, таких как скомпилированные исполняемые файлы или преобразованные документы, которые не должны постоянно храниться в репозитории.
Это означает, что если вы работаете в клонированном репозитории, вы можете не найти ожидаемые файлы. Это можно продемонстрировать на коротком примере. Внутри git-репозитория выполните git check-ignore, чтобы вывести список файлов, которые будут проигнорированы:
This command pipes the output from git to grep to show just the filenames containing that text. Now, you can confirm that fd will not find this file by default:
Хотя этот поиск находит множество результатов, обратите внимание, что ни один из проигнорированных файлов из предыдущей команды не обнаруживается с помощью fd.
По умолчанию fd будет учитывать .gitignore только если присутствует репозиторий git. Другими словами, вам нужна директория .git с правильной структурой, а не просто файл .gitignore.
Это поведение в целом будет понятно, если вы программист. Когда вы работаете с репозиторием, вас обычно интересуют постоянные файлы, а не те, которые создаются временно. Однако вы можете переопределить это поведение с помощью опции —no-ignore-vcs.
Вам, возможно, не понадобится такое поведение по умолчанию, но это легко исправить. Простое решение — создать псевдоним с опцией его отключения, т.е. alias fd=»fd —no-ignore-vcs».
fd также позволяет игнорировать шаблоны, указанные в файлах .ignore и .fdignore. Они предназначены для общего использования и для использования, специфичного для fd, соответственно.
Булева логика с использованием —and для нескольких шаблонов
Если ваши шаблоны становятся более сложными, вы можете использовать булеву логику, чтобы упростить их. Параметр —and позволяет искать файлы, которые соответствуют более чем одному шаблону. Например, предположим, что вы используете следующую команду, чтобы найти файлы, которые начинаются с заглавной буквы и содержат хотя бы одну цифру:
fd '^[A-Z].*[0-9]+.*'
Регулярное выражение немного неудобно из-за необходимости учитывать «другие символы» с помощью шаблона .* . Вместо этого вы можете разделить два теста на отдельные шаблоны, используя —and:
fd '^[A-Z]' --and '[0-9]+'
Это должно дать точно такие же результаты, но это чуть более понятно и немного проще для формулировки.
Или, может быть, у вас есть набор файлов вроде README.2025-09-12, 2025-09-10.README.md … Найти файлы с README и датой в любом порядке может быть затруднительно, но опция —and значительно упрощает задачу:
fd 'README' --and '[0-9]{4}-[0-9]{2}-[0-9]{2}'
Поиск новых файлов
Программа fd может делать больше, чем просто находить файлы по их имени. Она также может проверять файлы по их владельцу, размеру или времени последнего изменения. Последнее очень полезно, позволяя, например, находить «все файлы, изменённые на прошлой неделе».
fd --changed-within 1week
Конечно, вы можете комбинировать фильтры по дате с другими тестами, поэтому вот команда, которая найдёт все символические ссылки, принадлежащие пользователю bobby, изменённые сегодня:
fd --type l --owner bobby --newer 1d
Опция —newer делает то же самое, что и —changed-within, —change-newer-than и —changed-after.
Рекурсивный список всех файлов
Наконец-то удобное, но неожиданное применение fd, которое оно унаследовало от find: перечисление всех файлов. Если запустить его без аргументов, fd выведет все неигнорируемые файлы в текущем каталоге и во всех вложенных каталогах:
Если вы выполните эквивалент этой команды для find (find .), вы можете заметить, что она дает совсем другие результаты по сравнению с fd. Это подчеркивает стандартное поведение fd, который игнорирует скрытые файлы и другие, например, те, что указаны в .gitignore. Используйте параметр -u, чтобы переопределить это поведение, и вы должны получить одинаковое количество результатов для обеих команд:
Возможно, у вас возникнут трудности с тем, чтобы команда fd сохраняла цветной вывод при передаче его другой команде. Мне удалось добиться успеха с помощью опции —color и pager most, то есть fd —color always . | most.
Просмотр файлов таким образом может быть быстрым и простым способом ознакомиться с проектом, который вы клонировали, или с пакетом, который вы разархивировали. Цветовое выделение fd также должно помочь вам получить представление о разнообразии содержимого каталога.










Добавить комментарий