Шаблон имени файла linux

Шаблоны имен файлов

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.

Курс с ответами к заданиям и дополнительными уроками:
android-приложение, pdf-версия.

Источник

Фундаментальные основы Linux. Часть III. Раскрытие команд командной оболочкой

Глава 15. Формирование списков имен файлов на основе шаблонов

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

Звездочка (*)

Знак вопроса (?)

Квадратные скобки ([])

Диапазоны a-z и 0-9

Переменная окружения $LANG и квадратные скобки

В том случае, если в вашей системе устанавливается значение переменной окружения $LC_ALL , оно также должно быть сброшено для осуществления корректной генерации списков имен файлов.

Предотвращение формирования списков имен файлов на основе шаблонов

Практическое задание: формирование списков имен файлов на основе шаблонов

1. Создайте тестовую директорию и перейдите в нее.

(Имя последнего файла состоит из 6 символов, включая пробел).

3. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки file.

4. Выведите список всех имен файлов (с помощью команды ls), которые начинаются с строки File.

Читайте также:  Matlab 2010 windows 10

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. Создайте тестовую директорию и перейдите в нее.

(Имя последнего файла состоит из 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, предназначенные для изменения текущей директории?

Источник

Генерация имён файлов

Достраивание очень удобно, когда цель пользователя — задать один конкретный файл в командной строке. Если же нужно работать сразу с несколькими файлами — например для перемещения их в другой каталог с помощью mv , достраивание не помогает. Необходим способ задать одно «общее» имя для группы файлов, с которыми будет работать команда. В подавляющем большинстве случаев это можно сделать при помощи шаблона.

Читайте также:  Radeon 1600 pro драйвера windows 10

Шаблоны

Шаблон в командном интерпретаторе используется примерно в тех же целях, что и регулярное выражение, упомянутое в лекции Работа с текстовыми данными: для поиска строк определённй структуры среди множества разнообразных строк. В отличие от регулярного выражения, шаблон всегда примеряется к строке целиком, кроме того, он устроен значительно проще (а значит, и беднее).

Символы в шаблоне разделяются на обычные и специальные. Обычные символы соответствуют таким же символам в строке, а специальные обрабатываются особым образом:

  1. Шаблону, состоящему только из обычных символов, соответствует единственная строка, состоящая из тех же символов в том же порядке. Например, шаблону « abc » соответствует строка abc , но не aBc или ABC , потому что большие и маленькие буквы различаются.
  2. Шаблону, состоящему из единственного спецсимвола « * », соответствует любая строка любой длины (в том числе и пустая).
  3. Шаблону, состоящему из единственного спецсимвола « ? », соответствует любая строка длиной в один символ, например, a , + или @ , но не ab или 8888 .
  4. Шаблону, состоящему из любых символов, заключённых в квадратные скобки « [ » и « ] » соответствует строка длиной в один символ, причём этот символ должен встречаться среди заключённых в скобки. Например, шаблону « [bar] » соответствуют только строки a , b и r , но не c , B , bar или ab . Символы внутри скобок можно не перечислять полностью, а задавать диапазон, в начале которого стоит символ с наименьшим ASCII-кодом, затем следует « — », а затем — символ с наибольшим ASCII-кодом. Например, шаблону « [0-9a-fA-F] » соответствует одна шестнадцатеричная цифра (скажем, 5 , e или C ). Если после « [ » в шаблоне следует « ! », то ему соответствует строка из одного символа не перечисленного между скобками.
  5. Шаблону, состоящему из нескольких частей, соответствует строка, которую можно разбить на столько же подстрок (возможно, пустых), причём первая подстрока будет отвечать первой части шаблона, вторая — второй части и т. д. Например, шаблону « a*b?c » будут соответствовать строки ab@c (« * » соответствует пустая подстрока), a+b=c и aaabbc , но не соответствовать abc (« ? » соответствует подстрока c , а для « c » соответствия не находится), @ab@c (нет соответствия для « a ») или aaabbbc (из трёх b первое соответствует « b », второе — « ? », а вот третье приходится на « c »).

шаблон Строка специального формата, используемая в процедурах текстового поиска. Говорят, что строка соответствует шаблону, если можно по определённым правилам каждому символу строки поставить в соответствие символ шаблона. В Linux наиболее популярны шаблоны в формате командного интерпретатора и регулярные выражения.

Использование шаблонов

Шаблоны используются в нескольких конструкциях shell. Главное место их применения — командная строка. Если оболочка видит в командной строке шаблон, она немедленно заменяет его на список файлов, имена которых ему соответстуют. Команда, которая затем вызывается, получает в качестве параметров список файлов уже безо всяких шаблонов, как если бы этот список пользователь ввёл вручную. Эта способность командного интерпретатора называется генерацией имён файлов.

[methody@localhost methody]$ ls .bash*
.bash_history .bash_logout .bash_profile .bashrc
[methody@localhost methody]$ /bin/e*
/bin/ed /bin/egrep /bin/ex
[methody@localhost methody]$ ls *a*
-filename-with-
[methody@localhost methody]$ ls -dF *[ao]*
Documents/ examples/ loop to.sort*

Пример 7. Использование шаблона в командной строке

Мефодий, как это случается с новичками, немедленно натолкнулся на несколько «подводных камней», неизбежных в ситуации, когда конечный результат неизвестен. Только первая команда сработала не вопреки его ожиданиям: шаблон « .bash* » был превращён командной оболочкой в список файлов, начинающихся на .bash , этот список получила в качестве параметров командной строки ls , после чего честно его вывела. С « /bin/e* » Мефодию повезло — этот шаблон превратился в список файлов из каталога /bin , начинающихся на « e », и первым файлом в списке оказалась безобидная утилита /bin/echo . Поскольку в командной строке ничего, кроме шаблона, не было, именно строка /bin/echo была воспринята оболочкой в качестве команды, которой — в качестве параметров — были переданы остальные элементы списка — /bin/ed , /bin/egrep и /bin/ex .

Читайте также:  Активировать windows 10 прога

Можно вспомнить про нулевой параметр командной строки, обсуждавшийся в лекции Доступ процессов к файлам и каталогам.

Что же касается ls *a* , то, по расчётам Мефодия, эта команда должна была выдать список файлов в текущем каталоге, имя которых содержит « a ». Вместо этого на экран вывелось имя файла из подкаталога examples. Впрочем, никакой чёрной магии тут нет. Во-первых, имена файлов вида « .bash* » хотя и содержат « a », но начинаются на точку, и, стало быть, считаются скрытыми. Скрытые файлы попадают в результат генерации имён только если точка в начале указана явно (как в первой команде примера). Поэтому по шаблону « *a* » в домашнем каталоге Мефодия bash нашёл только подкаталог с именем examples , его-то он и передал в качестве параметра утилите ls . Что вывелось на экран в результате образовавшейся команды ls examples ? Конечно, содержимое каталога. Шаблон в последней команде из примера, « *[ao]* », был превращён в список файлов, чьи имена содержат « a » или « o » — Documents examples loop to.sort , а ключ « -d » потребовал у ls показывать информацию о каталогах, а не об их содержимом. В соответствии с ключом « -F », ls расставил « / » после каталогов и « * » после исполняемых файлов.

Ещё одно отличие генерации имён от стандартной обработки шаблона — в том, что символ « / », разделяющий элементы пути, никогда не ставится в соответствие « * » или диапазону. Происходит это не потому, что искажён алгоритм, а потому, что при генерации имён шаблон применяется именно к элементу пути, внутри которого уже нет « / ». Например, получить список файлов, которые находятся в каталогах /usr/bin и /usr/sbin и содержат подстроку « ppp » в имени, можно с помощью шаблона « /usr/*bin/*ppp* ». Однако одного шаблона, который бы включал в этот список ещё и каталоги /bin и /sbin — то есть подкаталоги другого уровня вложенности — по стандартным правилам сделать нельзя.

Генерация имён файлов в zsh предусматривает специальный шаблон « ** », которому соответствуют подстроки с любым количеством « / ». Пользоваться им следует крайне осторожно, понимая, что при генерации имён по такому шаблону выполняется операция, аналогичная не ls , а ls -R или find . Так, использование « /** » в начале шаблона вызовет просмотр всей файловой системы!

Если перед любым специальным символом стоит « \ », этот символ лишается специального значения, экранируется: пара « \символ » заменяется командным интерпретатором на « символ » и передаётся в командную строку безо всякой дальнейшей обработки:

[methody@localhost methody]$ echo *o*
Documents loop to.sort
[methody@localhost methody]$ echo \*o\*
*o*
[methody@localhost methody]$ echo «*o*»
*o*
[methody@localhost methody]$ echo *y*
*y*
[methody@localhost methody]$ ls *y*
ls: *y*: No such file or directory

Пример 8. Экранирование специальных символов и обработка «пустых» шаблонов

Мефодий заметил, что шаблон, которому не соответствует ни одного имени файла, bash раскрывать не стал, как если бы все « * » в нём были экранированы. В самом деле, какое из двух зол меньшее: изменять интерпретацию спецсимволов в зависимости от содержимого каталога, или сохранять логику интерпретации с риском превратить команду с параметрами в команду без параметров? Если бы, допустим, шаблон, которому не нашлось соответствия, попросту удалялся, то команда ls *y* превратилась бы в ls и неожиданно выдала бы содержимое всего каталога. Авторы bash (как и Стивен Борн, автор самой первой командной оболочки — sh ) выбрали более непоследовательный, но и более безопасный первый способ.

вторы zsh пошли по другому пути: в этой версии shell использование шаблона, которому не соответствует ни одно имя файла, приводит к ошибке, и соответствующая команда не выполняется.

Лишить специальные символы их специального значения можно и другим способом. В лекции Терминал и командная строка было рассказано, что разделители (пробелы, символы табуляции и символы перевода строки) перестают восприниматься таковыми, если часть командной строки, их содержащую, окружить двойными или одинарными кавычками. В кавычках перестаёт «работать» и генерация имён (как это видно из примера), и интерпретация других специальных символов. Двойные кавычки, однако, допускают выполнение подстановок переменной окружения и результата работы команды, описанных в двух следующих разделах.

Источник

Оцените статью