Ви, мабуть, вже використовували символи підстановки, не знаючи, що це таке. Якщо ви вказуєте файл в Windows® або виконуєте пошук файла, ви використовуєте *
для встановлення відповідності випадковому рядку. Наприклад, *.txt
відповідає всім файлам з іменами, які закінчуються на .txt
. Ми також часто використовували це в останньому розділі. Але крім *
існує ще багато інших підстановок.
Коли ви вводите команду на зразок ls *.txt і натискаєте на Enter, завдання по пошуку файлів, відповідних шаблону *.txt
, виконується не командою ls, а самим shell
'ом. Потрібне певне пояснення того, як командний рядок інтерпретується shell
'ом. Коли ви вводите:
$ ls *.txt readme.txt recipes.txt
командний рядок розбивається спочатку на слова (ls
і *.txt
в цьому прикладі). Коли командний процесор бачить у слові *
, він буде інтерпретувати все слово як шаблон підстановки і буде заміняти його іменами всіх відповідних файлів. Тому команда, перш ніж командний процесор виконає її, приймає вигляд ls readme.txt recipe.txt, що й дає очікуваний результат. Інші символи також змушують командний процесор реагувати таким чином:
?
: відповідає одному і тільки одному символу, незалежно від того, чим є цей символ;
[...]
: відповідає будь-якому символу, знайденому в дужках. Символи можуть бути визначені у вигляді діапазону символів (тобто 1-9
), у вигляді дискретних значень, або навіть у двох видах одночасно. Приклад: [a-zBE5-7]
відповідатиме всім символам між a
і z
, а також символам B
, E
, 5
, 6
чи 7
;
[!...]
: відповідає будь-якому символу не знайденому в дужках. [!a-z]
, наприклад, відповідатиме будь-якому символу, який не є буквою в нижньому регистрі[14];
{c1,c2}
: відповідає c1
або c2
, де c1
і c2
також є шаблонами підстановки. Це означає, що ви, наприклад, можете написати {[0-9]*,[acr]}
.
Далі представлено кілька шаблонів та їх значення:
/etc/*conf
: всі файли в каталозі /etc
з іменами, які закінчуються на conf
. Цьому можуть відповідати файли /etc/inetd.conf
, / etc/conf.linuxconf
, , а також /etc/conf
, якщо такий файл існує. Пам'ятаєте, що *
також може відповідати порожньому рядку.
image/{cars,space[0-9]}/*.jpg
: всі файли з іменами, які закінчуються на .jpg
, в каталогах image/cars
, image/space0
, (...), image/space9
, якщо такі каталоги існують.
/usr/share/doc/*/README
: всі файли з іменами README
в усіх підкаталогах, доступних безпосередньо після /usr/share/doc
. Одним із збігів, наприклад, буде /usr/share/doc/mandriva/README
, але не /usr/share/doc/myprog/doc/README
.
*[!a-z]
: всі файли у поточному каталозі з іменами, які не закінчуються буквою в нижньому регістрі.
[14] Будьте обережні! Хоча це справедливо для більшості мов, це може бути не так у вашому власному налаштуванні мови (локалі
). Це залежить від порядку сортування. У деяких мовних конфігураціях [a-z]
відповідатиме a, A, b, B, (...), z. Не кажучи вже про те, що деякі мови мають підкреслені символи...