20 авг. 2000 г.

Азы linux (для детей) урок 11

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


Командные оболочки Linux (shell, bash и др.), а также различные языки программирования позволяют выделять (искать) из множества имен файлов и каталогов определенные группы посредством использования так называемых шаблонов имен файлов. С шаблоном командная оболочка сравнивает очередной файл, и если он «вписался» в этот шаблон, то будет учтен, если нет — то будет пропущен. Грубо, шаблон можно сравнить с некой коробкой, в которую влезет не каждый предмет и не только из-за размеров, но и из-за несовпадения изгибов коробки и предмета.
Зачем нужны шаблоны? Часто требуется выполнить те или иные действия над целой группой файлов, т. к. это быстрее и удобнее, чем выполнять те же действия, обращаясь к файлам по одному. И шаблоны позволяют выделить группу, удовлетворяющую определенным условиям, из общей массы. Также шаблоны можно использовать для поиска файлов.
Шаблоны имен файлов (и каталогов) задаются с помощью специальных символов. Чаще используются два: * (звездочка) и ? (знак вопроса).
Звездочкой (*) в шаблоне обозначают любую группу символов. Их количество роли не играет (может быть только один символ или даже не одного). Так например, одиноко стоящая звезда — это шаблон, к которому подходят все файлы каталогов, в которых осуществляется поиск по данному шаблону. Использование шаблона *.html позволит выделить все html-файлы, а шаблона my*.odt – файлы начинающиеся с "my" и оканчивающиеся на ".odt". Шаблон *2010* определяет все файлы, в именах которых присутствует группа символов 2010.
Знаком вопроса (?) в шаблоне обозначают любой одиночный символ. Например, под шаблон otchet.??? подойдут файлы имеющие любое расширение из трех букв, но начинающиеся именно так, как задано в шаблоне. Вариант записи descrip?ion.pdf найдет файлы с заданными именем, но вместо знака вопроса может быть любой символ (например, s или t). Очевидно, что задание шаблонов с помощью знака вопроса используется реже, чем использование звездочки.
Предусмотрены и более сложные правила записи шаблонов. Так использование квадратных скобок ([ ]) со списком возможных значений позволяет осуществлять более гибкий поиск файлов. Пусть требуется найти все файлы имена которых начинаются с буквы m, при этом требуется не учитывать регистр. Тогда шаблон будет выглядеть так: [mM]*. Если требуется одновременно найти файлы, начинающиеся на буквы, идущие подряд в алфавите, то можно задать диапазон. Например, под шаблон [m-pM-P]???.png подойдут все файлы с расширением png, имена которых состоят из четырех букв, причем первая буква m или n или o или p без учета регистра.
Следует отметить, что в одном шаблоне можно использовать разные специальные символы.
В оболочке bash шаблоны используются совместно со многими командами. Например, ls (просмотр каталогов), cp (копирование файлов), find (поиск файлов) и др. Однако командам передается не шаблон, а уже подошедший под него файл (группа файлов). Определением подходящих под шаблон объектов занимается сама командная оболочка.

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

Особенности поиска файлов


Прежде чем искать файл(ы), необходимо ответить на два вопроса: где следует искать? и что следует искать?
Отвечая на первый вопрос (где искать?) нужно иметь в виду, что искать можно как в одном конкретном каталоге так и в нескольких, возможно даже находящихся в разных ветвях дерева каталогов. Ситуация также может усложняться тем, следует или нет искать во вложенных каталогах указанного места поиска?
Отвечая на вопрос «Что искать?», мы указываем свойство файла(ов), по которому может осуществляться поиск. После свойства должно следовать его конкретное значение. Другими словами, запрос типа «Найди файл по его размеру!» вряд ли удовлетворит исполнителя. А вот запрос «Найди файлы, размер которых менее 1Кб.» вполне разумен, т. к. содержит не только свойство (в данном случае, размер), но и определенное его значение (например, 1Кб).
Сложность поиска файлов заключается в том, что свойств у этих самых файлов достаточно много. Чаще у файлов наблюдаются следующие свойства:
  • имя,
  • размер,
  • времена создания, последнего обращения и изменения.
Кроме того, в unix-подобных ОС нашла распространение практика
  • деления файлов на типы (не путать с расширением файла в OC семейства Windows),
  • определения владельца и группы, которым принадлежит файл,
  • указания допустимых действий с файлом (чтение, изменение, выполнение).
Может показаться, что чаще всего файлы ищут по их именам. Однако не редки случаи, когда человек не помнит имени файла, а лишь дату его создания. Или, например, нужно искать файлы, подвергшиеся изменениям в ваше отсутствие (т.е. в определенный промежуток времени). Бывает, что требуется найти не обычный файл, а каталог, вдруг не оказавшийся на своем месте.
Несмотря на то, что разыскиваться может лишь один файл, обычно задается шаблон поиска, которому может соответствовать целая группа файлов. Это связано с тем, что часто бывает неизвестным полное имя файла, его точный размер или конкретное время создания и др. Все файлы, подходящие под шаблон поиска «высвечиваются» в результатах.
Поиск может происходить по нескольким свойствам сразу. При этом запрос поиска может быть задан так, что искомые файлы должны удовлетворять всем характеристикам сразу или любой из перечисленных.
Может быть и третья составляющая в «формуле» поиска файлов («где искать» + «что искать»). Это ответ на вопрос «Что делать с найденными объектами?». Есть разные программы для поиска, одни из них позволяют что-то сделать с найденными файлами, другие — нет.
Что же можно делать с отобранными файлами. Т.е. какова была цель поиска. Например, можно просто просмотреть их список и удостовериться, что такие файлы есть, узнать, где они находятся, и открыть их для изменения. Может потребоваться скопировать или переместить выбранные объекты в другой каталог.
В unix-подобных операционных системах нашла широкое распространение программа (утилита) find. С ее помощью можно найти любой файл или группу файлов, удовлетворяющих определенным критериям поиска. И это еще не все. Программа find позволяет также что-нибудь сделать с отобранными файлами. Понятно, что ее синтаксис достаточно сложен хотя бы из-за обилия характеристик (свойств), по которым могут искаться объекты. Мощь этой утилиты могут ощутить активные пользователи командной строки Linux (и других unix-подобных систем).
Особенности поиска файлов
В Linux есть замечательная утилита find, позволяющая искать файлы по весьма разнообразным параметрам, а также выполнять с ними определенные действия.
Язык программирования Python хорош для обработки строк и удобен при работе с файловой системой.
Зададимся целью реализовать часть функциональности find на Python, при этом задав будущей программе специфичность на сортировку файлов, а также в конце прикрутить к ней GUI.
Скорее всего, такие проекты существуют (и не обязательно на Python). Но в данном случае это будет учебный проект и основная его цель — обзавестись навыками практического программирования.
Опишем план действий:
  1. Изучить утилиту find. Здесь задача проста: познакомится с тем, что вообще можно делать с файлами.
  2. Сформулировать и описать функциональность будущей программы. Т. е. наконец понять, что мы хотим от программы. Здесь главное не переборщить, т.к. программировать мы пока особо не умеем.
  3. Разработать алгоритмы, реализующие описанные выше функции.
  4. Записать алгоритмы на языке Python, параллельно изучая сам Python, т. к. все его возможности нам пока не известны.
  5. Разработать графический интерфейс пользователя. Пусть программа будет в двух вариантах: для работы в текстовом режиме и в графическом.
Еще один момент. Нужно создать каталог с кучей разнообразных файлов и вложенных каталогов, который будет служить полигоном для проведения опытов (тестирования программы).