Шаблоны имен файлов в командной оболочке Bash

Bash, а также другие командные оболочки Linux и средства языков программирования позволяют находить в структуре дерева каталогов те файловые объекты, имена которых соответствуют определенному шаблону имени. Если имя определенного файла или каталога соответствует шаблону, то этот объект будет учтен, если нет – будет пропущен. Шаблоны имен также называют glob-шаблонами (globbing ‒ подстановка). Каждый можно представить как форму, через которую одни имена могут пройти, а другие ‒ нет.

Зачем нужны шаблоны имен? Часто требуется выполнить однотипные действия над группой файлов. Описывать эти действия по отношению к каждому отдельному файлу или перечислять их все после команды было бы трудоемкой задачей. Таким образом, шаблоны позволяют выделить группу объектов, чьи имена удовлетворяют определенным условиям, из общей массы.

Кроме того, шаблоны часто используют для поиска файлов, и тогда их называют шаблонами поиска.

Шаблоны имен файлов и каталогов задаются с помощью специальных символов подстановки (джокер-символов). Чаще используются два: * – звездочка, ? – знак вопроса. По-сути glob-шаблоны можно считать упрощенными регулярными выражениями.

Звездочкой * в шаблоне обозначают любую группу символов. Их количество роли не играет. Это могут быть пять, десять, один символ или даже ни одного. Так, например, шаблону, состоящему всего из одного символа *, будет соответствовать абсолютно любой файл. Использование шаблона *.html позволит выделить все html-файлы, а шаблон readme.* – файлы с именем "readme" и любым расширением. Шаблон *2025* определяет все файлы, в именах которых присутствует группа символов "2025".

$ ls *.txt
RAM.txt  test_vim.txt
$ ls *25*
2025.ods  liga0525.tar

В Bash glob-шаблоны используются с командами, которые в качестве аргументов принимают имена файлов. Например, ls – просмотр каталогов, cp – копирование файлов, find – поиск файлов и др. Однако на самом деле командам передается не шаблон, а уже подошедшие под него файлы. Определением подходящих под шаблон объектов занимается сама командная оболочка Linux, в данном случае Bash.

Знаком вопроса ? в шаблоне обозначают любой один символ. Например, под шаблон report.??? подойдут файлы, имеющие расширение из любых трех букв, но начинающиеся именно так, как задано в шаблоне. Шаблону about?article.odt будут соответствовать файлы с заданным именем, но вместо знака вопроса может стоять любой символ.

$ cp test?.py save
$ ls save/test?.py
save/test1.py  save/test2.py
$ ls *-???.xml
sitemap-amp.xml

Понятно, что в одном шаблоне можно использовать разные символы-джокеры.

Кроме звезды и вопроса (в ряде языков программирования вместо них используются другие символы), существуют более сложные правила записи шаблонов. Так использование квадратных скобок [] со списком вложенных значений позволяет осуществлять более гибкий поиск файлов. Пусть требуется найти все файлы, имена которых начинаются с буквы "r", при этом регистр не учитывается. Шаблон будет выглядеть так: [rR]*.

$ ls -d [rR]*
RAM.txt  repo-clone

Если надо одновременно найти файлы, имена которых включают символы, идущие подряд в алфавите, или любую цифру из диапазона, то используется тире. Так под шаблон [a-dA-D]?[1-9].* подойдут все файлы, имена которых без учета расширения состоят из трех символов. Причем первый может быть буквой "a" или "b" или "c" или "d" без учета регистра. Второй символ может быть любым. Третий - любой цифрой в диапазоне от 1 до 9.

$ ls [a-dA-D]?[1-9].*
d_7.txt

С помощью восклицательного знака набор символов можно инвертировать, то есть запрещать перечисленные в квадратных скобках. Например, шаблон [!t][!e][!s][!t]* соответствует всем именам, но не тем, которые начинаются со слова "test". Чтобы подойти шаблону [!ts]* имя не должно начинаться с буквы "t" или "s".

Примеры шаблонов имен файлов