| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия |
| linux:console:wildcards [2026/07/03 18:58] – [Примеры использования] so_v_a | linux:console:wildcards [2026/09/12 12:10] (текущий) – so_v_a |
|---|
| # Подстановочные знаки (Wildcards) | <!DOCTYPE markdown> |
| | |
| | # Подстановочные знаки (Standard Wildcards или Globbing Patterns) |
| |
| Подстановочные знаки — это символы, имеющие особое значение. Они могут представлять буквы или цифры, наборы символов или даже множество символов.\\ | Подстановочные знаки — это символы, имеющие особое значение. Они могут представлять буквы или цифры, наборы символов или даже множество символов.\\ |
| Когда мы помещаем подстановочные знаки вместо имени файла, то bash расширит эти подстановочные знаки до любого соответствующего имени файла, это называется расширением имени файла или подстановкой ([[http://example.com|globbing]]). | |
| | Когда мы помещаем подстановочные знаки вместо имени файла, то командная оболочка (bash и др.) расширит эти подстановочные знаки до любого соответствующего имени файла, это называется расширением имени файла или подстановкой ([[https://tldp.org/LDP/abs/html/globbingref.html|Globbing]]). |
| | |
| | <blockquote>Командная оболочка (bash и др.) раскрывает шаблон имён файлов **до** запуска команды, которая затем обрабатывает полученный список файлов.</blockquote> |
| ## Wildcards | ## Wildcards |
| |
| <blockquote>Если мы не укажем явный путь или разделитель путей (т.е. "/") в наши шаблоны, то bash не будет расширяться до имен файлов за пределами текущего каталога.</blockquote> | <blockquote>Если мы не укажем явный путь или разделитель путей (т.е. "/") в наши шаблоны, то bash не будет расширяться до имен файлов за пределами текущего каталога.</blockquote> |
| . | . |
| | |
| ## Примеры использования | ## Примеры использования |
| |
| Обратите внимание, что ***** соответствует как **abc** , так и **abc1**, **abc2**, **abc3** , тогда как **?** не соответствует **abc**. Это связано с тем, что ** * ** означает //ноль или более любых символов//, а **?** предназначен //ровно для одного любого символа//.\\ | Обратите внимание, что ***** соответствует как **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, чтобы он соответствовал всему, //кроме символов, перечисленных в наборе//. |
| | |
| | <blockquote>Все специальные символы теряют смысл внутри квадратных скобок (**[]**), за исключением "**-**" который приобретает особый смысл, т. е. **[? \*]** будет соответствовать только знаку вопроса или восклицательному знаку, но они не будут использоваться как подстановочные символы.</blockquote> |
| | . |
| | ### Списки, {} |
| | |
| | Фигурные скобки **{}** используются для хранения списка терминов, разделенных запятыми, которые могут быть сопоставлены. |
| | |
| | ``` |
| | $ 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]] |
| |