- Шаблоны имен файлов linux
- Звездочка (*)
- Знак вопроса (?)
- Квадратные скобки ([])
- Диапазоны a-z и 0-9
- Переменная окружения $LANG и квадратные скобки
- Предотвращение формирования списков имен файлов на основе шаблонов
- Практическое задание: формирование списков имен файлов на основе шаблонов
- Корректная процедура выполнения практического задания: формирование списков имен файлов на основе шаблонов
- Шаблоны имен файлов
Шаблоны имен файлов linux
Библиотека сайта rus-linux.net
формирование списков имен файлов на основе шаблонов (или динамическую генерацию списков имен файлов). В данной главе даются пояснения относительно работы данного механизма.
Звездочка (*)
Звездочка * интерпретируется командной оболочкой как символ для генерации списка имен файлов, причем сам символ звездочки может преобразовываться в любую комбинацию символов (или даже в строку без символов). В том случае, если не задано пути к директории для формирования списка имен файлов, командная оболочка будет использовать имена файлов из текущей директории. Обратитесь к странице руководства glob(7) для получения дополнительной информации. (Данный вопрос также рассматривается в теме LPI 1.103.3.)
[paul@RHELv4u3 gen]$ ls file1 file2 file3 File4 File55 FileA fileab Fileab FileAB fileabc [paul@RHELv4u3 gen]$ ls File* File4 File55 FileA Fileab FileAB [paul@RHELv4u3 gen]$ ls file* file1 file2 file3 fileab fileabc [paul@RHELv4u3 gen]$ ls *ile55 File55 [paul@RHELv4u3 gen]$ ls F*ile55 File55 [paul@RHELv4u3 gen]$ ls F*55 File55 [paul@RHELv4u3 gen]$
Знак вопроса (?)
Аналогично звездочке, знак вопроса ? интерпретируется командной оболочкой как символ для генерации списка имен файлов, причем сам знак вопроса соответствует ровно одному символу имени файла.
[paul@RHELv4u3 gen]$ ls file1 file2 file3 File4 File55 FileA fileab Fileab FileAB fileabc [paul@RHELv4u3 gen]$ ls File? File4 FileA [paul@RHELv4u3 gen]$ ls Fil?4 File4 [paul@RHELv4u3 gen]$ ls Fil?? File4 FileA [paul@RHELv4u3 gen]$ ls File?? File55 Fileab FileAB [paul@RHELv4u3 gen]$
Квадратные скобки ([])
Открывающаяся квадратная скобка [ интерпретируется командной оболочкой как символ для генерации списка имен файлов, соответствующий любым из символов, находящихся между символом [ и первым следующим за ним символом ] . Порядок следования символов в списке между скобками не имеет значения. Каждая пара символов скобок заменяется ровно на один символ.
[paul@RHELv4u3 gen]$ ls file1 file2 file3 File4 File55 FileA fileab Fileab FileAB fileabc [paul@RHELv4u3 gen]$ ls File[5A] FileA [paul@RHELv4u3 gen]$ ls File[A5] FileA [paul@RHELv4u3 gen]$ ls File[A5][5b] File55 [paul@RHELv4u3 gen]$ ls File[a5][5b] File55 Fileab [paul@RHELv4u3 gen]$ ls File[a5][5b][abcdefghijklm] ls: невозможно получить доступ к File[a5][5b][abcdefghijklm]: Нет такого файла или каталога [paul@RHELv4u3 gen]$ ls file[a5][5b][abcdefghijklm] fileabc [paul@RHELv4u3 gen]$
Также с помощью символа восклицательного знака ! вы можете исключать символы из списка, расположенного между квадратными скобками. Кроме того, у вас имеется возможность создания комбинаций из описанных выше шаблонов .
[paul@RHELv4u3 gen]$ ls file1 file2 file3 File4 File55 FileA fileab Fileab FileAB fileabc [paul@RHELv4u3 gen]$ ls file[a5][!Z] fileab [paul@RHELv4u3 gen]$ ls file[!5]* file1 file2 file3 fileab fileabc [paul@RHELv4u3 gen]$ ls file[!5]? fileab [paul@RHELv4u3 gen]$
Диапазоны a-z и 0-9
[paul@RHELv4u3 gen]$ ls file1 file3 File55 fileab FileAB fileabc file2 File4 FileA Fileab fileab2 [paul@RHELv4u3 gen]$ ls file[a-z]* fileab fileab2 fileabc [paul@RHELv4u3 gen]$ ls file6 file1 file2 file3 [paul@RHELv4u3 gen]$ ls file[a-z][a-z]5* fileab2 [paul@RHELv4u3 gen]$
Переменная окружения $LANG и квадратные скобки
В ходе работы с командной оболочкой не стоит забывать о влиянии на процесс генерации имен файлов значения переменной окружения LANG . Причина этого влияния заключается в том, что в некоторых языках строчные буквы включаются в диапазон прописных букв (и наоборот).
paul@RHELv4u4:~/test$ ls [A-Z]ile? file1 file2 file3 File4 paul@RHELv4u4:~/test$ ls [a-z]ile? file1 file2 file3 File4 paul@RHELv4u4:~/test$ echo $LANG en_US.UTF-8 paul@RHELv4u4:~/test$ LANG=C paul@RHELv4u4:~/test$ echo $LANG C paul@RHELv4u4:~/test$ ls [a-z]ile? file1 file2 file3 paul@RHELv4u4:~/test$ ls [A-Z]ile? File4 paul@RHELv4u4:~/test$
В том случае, если в вашей системе устанавливается значение переменной окружения $LC_ALL , оно также должно быть сброшено для осуществления корректной генерации списков имен файлов.
Предотвращение формирования списков имен файлов на основе шаблонов
В примере ниже не должно быть ничего удивительного. При использовании команды echo * в пустой директории будет выведен символ * . А при использовании той же команды в директории с файлами будут выведены имена всех файлов.
paul@ubu1010:~$ mkdir test42 paul@ubu1010:~$ cd test42 paul@ubu1010:~/test42$ echo * * paul@ubu1010:~/test42$ touch file42 file33 paul@ubu1010:~/test42$ echo * file33 file42
Формирование списков имен файлов на основе шаблонов может быть предотвращено путем помещения специальных символов в кавычки, а также экранирования этих символов таким образом, как показано в примере ниже.
paul@ubu1010:~/test42$ echo * file33 file42 paul@ubu1010:~/test42$ echo \* * paul@ubu1010:~/test42$ echo '*' * paul@ubu1010:~/test42$ echo "*" *
Практическое задание: формирование списков имен файлов на основе шаблонов
1. Создайте тестовую директорию и перейдите в нее.
file1 file10 file11 file2 File2 File3 file33 fileAB filea fileA fileAAA file( file 2
(Имя последнего файла состоит из 6 символов, включая пробел).
3. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки file.
4. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки File.
5. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки file и заканчиваются числовым символом.
6. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки file и заканчиваются буквенным символом.
7. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки File и имеют пятый числовой символ.
8. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки File, имеют пятый числовой символ и никаких символов более.
9. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с буквенного символа и заканчиваются числовым символом.
10. Выведите список всех имен файлов (с помощью команды ls), которые состоят ровно из пяти символов.
11. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с символа f или F и оканчиваются символом 3 или A.
12. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с символа f и оканчиваются числовым символом, причем вторым символом является символ i или R.
13. Выведите список всех имен файлов (с помощью команды ls), которые не начинаются с символа F.
14. Скопируйте значение переменной окружения $LANG в значение переменной окружения $MyLANG.
15. Продемонстрируйте влияние значения переменной окружения $LANG на вывод имен файлов с буквенными символами из диапазонов A-Z или a-z.
16. Вы получили информацию о том, что один из ваших серверов был взломан, причем взломщик, вероятнее всего, подменил бинарный файл с реализацией команды ls . Вы знаете о том, что использование команды echo не несет опасности. Можно ли заменить команду ls командой echo ? Как вы будете выводить список файлов в текущей директории с помощью команды echo ?
17. Существуют ли другие команды, помимо cd, предназначенные для изменения текущей директории?
Корректная процедура выполнения практического задания: формирование списков имен файлов на основе шаблонов
1. Создайте тестовую директорию и перейдите в нее.
file1 file10 file11 file2 File2 File3 file33 fileAB filea fileA fileAAA file( file 2
(Имя последнего файла состоит из 6 символов, включая пробел).
touch file1 file10 file11 file2 File2 File3 touch file33 fileAB filea fileA fileAAA touch "file(" touch "file 2"
3. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки file.
4. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки File.
5. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки file и заканчиваются числовым символом.
6. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки file и заканчиваются буквенным символом.
7. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки File и имеют пятый числовой символ.
8. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки File, имеют пятый числовой символ и никаких символов более.
9. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с буквенного символа и заканчиваются числовым символом.
10. Выведите список всех имен файлов (с помощью команды ls), которые состоят ровно из пяти символов.
11. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с символа f или F и оканчиваются символом 3 или A.
12. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с символа f и оканчиваются числовым символом, причем вторым символом является символ i или R.
13. Выведите список всех имен файлов (с помощью команды ls), которые не начинаются с символа F.
14. Скопируйте значение переменной окружения $LANG в значение переменной окружения $MyLANG.
15. Продемонстрируйте влияние значения переменной окружения $LANG на вывод имен файлов с буквенными символами из диапазонов A-Z или a-z.
Обратитесь к примеру в книге.
16. Вы получили информацию о том, что один из ваших серверов был взломан, причем взломщик, вероятнее всего, подменил бинарный файл с реализацией команды ls . Вы знаете о том, что использование команды echo не несет опасности. Можно ли заменить команду ls командой echo ? Как вы будете выводить список файлов в текущей директории с помощью команды echo ?
17. Существуют ли другие команды, помимо cd, предназначенные для изменения текущей директории?
Предыдущий раздел: | Оглавление | Следующий раздел: |
Глава 14. История команд командной оболочки | 16. Перенаправление потоков ввода/вывода |
Шаблоны имен файлов
Bash, а также другие командные оболочки Linux и средства языков программирования позволяют находить в структуре дерева каталогов те файлы, имена которых соответствуют определенному шаблону имени файла. В случае командной оболочки именно она сравнивает с шаблоном имя очередного файла. Если оно соответствует шаблону, то файл будет учтен, если нет – будет пропущен. Шаблон можно сравнить с коробкой, в которую влезет не каждый объект. Не только из-за размеров, также из-за несовпадения формы коробки и предмета.
Зачем нужны шаблоны имен? Часто требуется выполнить однотипные действия над группой файлов. Описывать эти действия по отношению к каждому отдельному файлу или перечислять их все после команды было бы трудоемкой задачей. Таким образом, шаблоны позволяют выделить группу файлов, чьи имена удовлетворяют определенным условиям, из общей массы.
Кроме того, шаблоны часто используют для поиска файлов.
Шаблоны имен файлов и каталогов задаются с помощью специальных символов. Чаще используются два: * – звездочка, ? – знак вопроса.
Звездочкой (*) в шаблоне обозначают любую группу символов. Их количество роли не играет. Это могут быть пять, десять, один символ или даже ни одного. Так, например, шаблону, состоящему всего из одного символа * , будет соответствовать абсолютно любой файл. Использование шаблона *.html позволит выделить все html-файлы, а шаблон my*.odt – файлы, начинающиеся с «my» и оканчивающиеся на «.odt». Шаблон *2010* определяет все файлы, в именах которых присутствует группа символов 2010.
Знаком вопроса (?) в шаблоне обозначают любой один символ. Например, под шаблон otchet. подойдут файлы, имеющие расширение из любых трех букв, но начинающиеся именно так, как задано в шаблоне. Шаблону descrip?ion.pdf будут соответствовать файлы с заданным именем, но вместо знака вопроса может стоять любой символ.
Кроме символов звезды и вопроса, существуют более сложные правила записи шаблонов. Так использование квадратных скобок [ ] со списком вложенных значений позволяет осуществлять более гибкий поиск файлов. Пусть требуется найти все файлы, имена которых начинаются с буквы m , при этом регистр не учитывается. Шаблон будет выглядеть так: [mM]* .
Если надо одновременно найти файлы, начинающиеся на буквы, идущие подряд в алфавите, то задается диапазон. Например, под шаблон [m-pM-P]. png подойдут все файлы с расширением png, имена которых состоят из четырех букв, причем первая буква m или n или o или p без учета регистра.
Понятно, что в одном шаблоне имени файла можно использовать разные специальные символы. Например, [aA]*. .
В Bash шаблоны имен используются с командами, которые в качестве аргументов принимают имена файлов. Например, ls – просмотр каталогов, cp – копирование файлов, find – поиск файлов и др. Однако на самом деле командам передается не шаблон, а уже подошедшие под него файлы. Определением подходящих под шаблон объектов занимается сама командная оболочка Linux, в данном случае Bash.
Курс с ответами к заданиям и дополнительными уроками в PDF
Введение в Linux и Bash. Курс