Это старая версия документа!
# Подстановочные знаки (Standard Wildcards или Globbing Patterns)
Подстановочные знаки — это символы, имеющие особое значение. Они могут представлять буквы или цифры, наборы символов или даже множество символов.
Когда мы помещаем подстановочные знаки вместо имени файла, то командная оболочка (bash и др.) расширит эти подстановочные знаки до любого соответствующего имени файла, это называется расширением имени файла или подстановкой (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 ``` .
## Документация
Ссылка на Linux Documentation Project - Wildcards
