Ви, мабуть, вже використовували символи підстановки, не знаючи, що це таке. Якщо ви вказуєте файл в 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. Не кажучи вже про те, що деякі мови мають підкреслені символи...