Про find можно писать много и долго, а если еще перевести мануал и снабдить каждый параметр развернутыми примерами, то материала получится на целую книгу. Пока эту книгу никто не написал, я решил рассказать о некоторых особенностях работы утилиты с регулярками и другими функциями.
Регулярки освоить нетрудно. Буквально за пару часов можно получить почти средний уровень владения и научиться читать и писать выражения для поиска ip-адресов, e-mail, html-тегов, телефонных номеров, дат и прочих несложных конструкций. Я думаю, все это вам знакомо, но на всякий случай в конце статьи я добавил несколько ссылок для изучения.
Я уже прошел «курс молодого бойца» по регуляркам, написал свою, вставил в find, и она не сработала. Но пойдем по порядку.

Find и опция -name
В самых простых случаях find ищет по имени с помощью опции -name.
Простой пример. Найти в директории /DATA все файлы, в имени которых есть conf:

В данном случае мы обходимся опцией -name, которая принимает такие простейшие паттерны поиска, как:
* — любое количество любых символов;
? — один любой символ
В примере выше найдутся все файлы, в имени которых есть conf, с любыми символами до и после этого самого conf.
Знак вопроса можно использовать, когда известно точное количество символов, но неизвестно, что это за символы. Например, если необходимо найти все файлы с расширением .conf, имя которых содержит три символа:

Когда нам нужны запросы посложнее, то опция -name уступает место опции -regex, которая позволяет более гибко составлять запросы.
Опция -regex для регулярных выражений
Как видно из примера выше, нам удалось найти разные файлы с расширением .conf, имя которых содержит три символа. А что делать, если нам нужно найти только те файлы, что состоят из трех цифр?
Пишем опцию -regex, вставляем несложную регулярку \d{3}\.conf и… ничего не находится. Попробуем углубиться в вопрос.
Во-первых, Find поддерживает различные синтаксисы регулярных выражений. Список можно получить по команде find . -regextype help.
Почитать о некоторых типах, с которыми работает find, можно, например, тут.
Во-вторых, регулярное выражение применяется к результатам поиска, а он, в свою очередь, представляет собой имена файлов с абсолютными путями. Поэтому, если мы хотим применить регулярку к имени файла, она должна начинаться с символов “.*/” Этой конструкцией мы перекрываем все абсолютные пути, и основная часть регулярки будет применяться непосредственно к имени файла.
В статье и приведенных примерах подразумевается, что директории и файлы, с которыми работает find, не содержат в именах спецсимволов, знаков препинания, букв нелатинского алфавита, ASCII-символов и других нестандартных элементов.
Метасимвол \d, обозначающий одну десятичную цифру, работает в регулярных выражениях для javascript, java и некоторых других языков. Тут цифры можно указать конструкцией вида [0-9] (именуется символьным классом), а число повторений — взять в фигурные скобки {3}(именуется квантификатором, который определяет, сколько раз предшествующее выражение может встречаться). По умолчанию find использует regextype emacs, и в нем нет числовых квантификаторов. А вот в regextype sed фигурные скобки надо экранировать обратным слешем, так что квантификатор будет выглядеть так: \{3\}. Я же использовал regextype egrep (он же posix-egrep), в нем не нужно экранировать фигурные скобки.
Теперь наш запрос:
find /DATA -type f -regextype egrep -regex ".*/[0-9]{3}\.conf" (точка является метасимволом, обозначающим один любой символ. Чтобы превратить ее обратно в точку, ее надо экранировать обратным слешем).
Вот результат:

Повторять символьные классы тоже можно. Результат будет такой же:

Как вы могли заметить, в символьном классе в квадратных скобках указывается значение (в нашем случае через дефис указывается диапазон значений), которое может иметь символ. Для букв используется точно такой же шаблон. Для поиска файла, в имени которого есть только пять латинских букв и который имеет расширение .log, используется следующий запрос:
find /DATA -type f -regextype egrep -regex ".*/[a-zA-Z]{5}\.log"
Результат:

Обратите внимание, что при написании регулярного выражения регистр имеет значение. Только для заглавных букв следует использовать вариант [A-Z], а для строчных — [a-z]. Чтобы регистр значения не имел, find предлагает воспользоваться опцией -iregex. Я же советую использовать вариант [a-zA-Z], чтобы выражение работало не только в find.
В качестве числа повторений символов, которые мы указываем в фигурных скобках, можно использовать и диапазон через запятую. Например, чтобы найти имена, содержащие от трех до пяти букв, нужно написать следующий запрос:

Можно не задавать обе границы диапазона, и тогда поиск сработает только по одной. Например, в случае [a-zA-Z]{4,} мы получим имена, содержащие четыре и более букв.
А в выражении [a-zA-Z]{,6} — имена файлов, содержащие до шести букв.
Чтобы инвертировать запрос, исключив из результатов все совпадения, нужно перед -regex поставить восклицательный знак или написать -not. Например:
find /DATA -type f -regextype egrep ! -regex ".*/.*[0-9]+\.log"
В результате не будут показаны файлы .log с цифрами в конце имени.
Еще немного о квантификаторах
Символ звездочка * является метасимволом квантификатора и обозначает повторение предыдущего символа ноль и более раз. Например, вы ищете файл с именем temp и расширением .log и при этом знаете, что имя файла на конце может содержать цифры, а может и не содержать. То есть нужно найти как temp.log, так и temp04.log
Запрос будет выглядеть так:

Знак плюс + также является метасимволом квантификатора и обозначает повторение предыдущего символа или паттерна один и более раз. Например, вам нужно найти все файлы с именем name и расширением .txt. При этом в нем после name присутствуют цифры, но вы не знаете их количество. Получится такой запрос:
find /DATA -type f -regextype egrep -regex ".*/name[0-9]+\.txt"
Также следует учесть, что квантификаторы могут применяться к символьному классу или группе. Например, рассмотрим следующий запрос:
find /DATA -type f -regextype egrep -regex ".*/[a-zA-Z]{3}+\.log"
В результате выполнения такого запроса мы получим все файлы с именем, включающие три буквы, шесть букв, девять и т. д. То есть паттерн [a-zA-Z]{3} будет повторен один и более раз.

Немного о группировке
Для решения некоторых задач паттерны поиска можно группировать. Например, нам нужно найти файлы с расширением .hw, имена которых заканчиваются на числа от 110 до 120. Получается такая конструкция:
find /DATA -type f -regextype egrep -regex ".*/.*(11[0-9]|120)\.hw"
В результате создается группа, левой частью которой мы покрываем диапазон чисел от 110 до 119, а правой — только число 120. Таким образом, в вывод утилиты попадут файлы с именами, включающими числа от 110 до 119 и 120 (сортировка добавлена для удобочитаемости результата):

Компоновка запросов
Запросы можно компоновать и ставить между ними логические операции.
Например, так:
find /DATA -type f -regextype egrep -regex ".*/.*(11[0-9]|120)\.hw" -or \
-regex ".*/.*(21[0-9]|220)\.hw"
В первый паттерн положил 110-119 и 120, а во второй — 210-219 и 220. Логическое «или» между паттернами — это параметр -or (или просто -o)
И вот результат (сортировка добавлена для удобочитаемости результата):

Так же работает логическое «и» через параметр -and (или просто -a).
Запросы можно группировать с помощью круглых скобок и использовать логические операции между группами. Сами скобки в запросе нужно экранировать обратным слешем.
find . \( regex1 -and regex2 \) -or \( regex3 -and regex4 \)
Про пробелы
В egrep в качестве пробела выступает сам пробел, но в символьном классе его использовать не получится. Также можно использовать классы из POSIX

Переменные
Как правило, подобные задачи в однострочниках почти никогда не решаются. Чаще такое поведение прописывается в сценариях, а переменные — их неотъемлемая составляющая. В переменную можно завернуть какую-то часть или целое регулярное выражение, например:
aaa="[0-7]{3}"
bbb=”.*/530\.conf”
find /DATA -type f -regextype egrep -regex ".*/$aaa\.conf" -o -regex $bbb
А еще можно завернуть группы выражений и даже весь запрос целиком:
ccc=”/DATA -type f -regextype egrep”
ddd="-regex .*/[0-7]{3}\\.conf -o -regex .*/530\\.conf"
find $ccc $ddd
Результат предыдущего поиска и даже небо и даже сам find:
aaa="find"
bbb=$(find /DATA -type d -name "logs")
ccc="-type f"
ddd="-regextype egrep -regex .*/[a-zA-Z]{3,5}[0-9]*\\..*"
eee="-exec ls -l {} +"
$aaa $bbb $ccc $ddd $eee

Главное - не запутаться в экранировании, set -x вам в помощь.
И следует учитывать, что если переменная в своем содержании ссылается на другую переменную, то find вас не поймет. Но это уже совсем другая история.
Вместо итогов — несколько ссылок
Регулярные выражения можно быстро освоить и поиграться с ними на следующих ресурсах:
– на википедии есть хорошая статья с примерами;
– 25+ интерактивных уроков по базовым паттернам (я начинал знакомство с регулярками с них);
– конструкторы (один и второй), где вы можете поиграться, создать и протестировать регулярки для своих нужд.
По работе самой утилиты find есть неплохая статья.
Логика работы утилиты с регулярками практически повторяет логику работы с другими опциями, но я старался не повторять то, что описано не раз в других статьях
Хотел написать и про printf, но материала там получится слишком много. Вот неплохой вариант раскрытия этой темы на английском языке.
*Статья написана в рамках ХабраЧелленджа 4.0, который прошел в ЛАНИТ весной 2025 года. О том, что такое ХабраЧеллендж, читайте здесь.