# Подстановочные знаки (Standard Wildcards или Globbing Patterns) Подстановочные знаки — это символы, имеющие особое значение. Они могут представлять буквы или цифры, наборы символов или даже множество символов.\\ Когда мы помещаем подстановочные знаки вместо имени файла, то командная оболочка (bash и др.) расширит эти подстановочные знаки до любого соответствующего имени файла, это называется расширением имени файла или подстановкой ([[https://tldp.org/LDP/abs/html/globbingref.html|Globbing]]).
Командная оболочка (bash и др.) раскрывает шаблон имён файлов **до** запуска команды, которая затем обрабатывает полученный список файлов.
## Wildcards Bash имеет лишь несколько подстановочных знаков, которые он распознает, но они очень мощные. * **?** - представляет один символ. * ** * ** — представляет ноль или более символов. * **[ ]** — представляет диапазон или набор символов. * **{ }** – представляет собой список терминов, разделенных запятыми. * **[! ]** — представляет любой символ, не входящий в диапазон или набор. * ** \ ** — используется для экранирования любого из вышеуказанных символов, чтобы вы могли искать их в имени файла Пример использования: ``` $ ls file1.jpg file2.jpg figure.png report.txt facts.txt $ ls f* file1.jpg file2.jpg figure.png facts.txt $ ls *.txt report.txt facts.txt ``` здесь, когда выполняется такая команда, как `ls *.txt` то bash расширяет это и заменяет ** *.txt ** любым файлом или каталогом, соответствующим шаблону (в данном случае это: //ноль или более символов, за которыми следует «.txt»//).
Если мы не укажем явный путь или разделитель путей (т.е. "/") в наши шаблоны, то bash не будет расширяться до имен файлов за пределами текущего каталога.
. ## Примеры использования ### Соответствие многим, одному и нулю символов ( ? и *) Чтобы сопоставить ноль или несколько символов или ровно один из любого символа, мы используем подстановочные знаки ** * ** и **?** ``` $ ls abc abc1 abc2 abc3 xyz xyz1 xyz2 xyz3 $ ls abc* abc abc1 abc2 abc3 $ ls abc? abc1 abc2 abc3 ``` Обратите внимание, что ***** соответствует как **abc** , так и **abc1**, **abc2**, **abc3** , тогда как **?** не соответствует **abc**. Это связано с тем, что ** * ** означает //ноль или более любых символов//, а **?** предназначен //ровно для одного любого символа//.\\ Если бы мы хотели сопоставить //один или несколько символов//, то ** * ** не сработает. Однако если мы объединим эти два понятия, как ** ?* **, то это будет соответствовать //одному или нескольким символам//. ### Наборы и диапазоны, [] Квадратные скобки (**[]**) позволяют нам реализовать два типа совпадений. Мы можем сопоставить список символов или диапазон, разделенный дефисом "**-**". Если бы мы хотели перечислить все файлы длиной в три буквы, то могли бы это сделать так: ``` $ ls [a-z][a-z][a-z] abc xyz $ ls [abcxyz][abcxyz][abcxyz] abc xyz $ ls [a-y][a-y][a-y] abc $ ls [A-Z][A-Z][A-Z] ``` В строке 1 мы указали bash три диапазона для сопоставления. Каждый диапазон будет соответствовать только одному символу, поэтому для соответствия трем символам потребовалось три диапазона. Также обратите внимание, что //последняя команда ни с чем не совпала, поскольку Linux чувствителен к регистру//. Строки 1 и 3 дают одинаковый результат, но если в строке 1 используется диапазон, то в строке 3 используются наборы.\\ Мы могли бы объединить диапазоны в наборе.\\ Чтобы сопоставить //все буквы и цифры, как в верхнем, так и в нижнем регистре//, мы должны использовать [a-zA-Z0-9].\\ Разместив "**!**" в начале набора или диапазона мы указываем bash, чтобы он соответствовал всему, //кроме символов, перечисленных в наборе//.
Все специальные символы теряют смысл внутри квадратных скобок (**[]**), за исключением "**-**" который приобретает особый смысл, т. е. **[? \*]** будет соответствовать только знаку вопроса или восклицательному знаку, но они не будут использоваться как подстановочные символы.
. ### Списки, {} Фигурные скобки **{}** используются для хранения списка терминов, разделенных запятыми, которые могут быть сопоставлены. ``` $ ls {abc,xyz}1 abc1 xyz1 $ ls abc{1,3} abc1 abc3 ``` . ## Документация Ссылка на [[https://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm|Linux Documentation Project - Wildcards]]