Именем файла в
открытой ОС может быть любая строка поддерживаемых символов, не содержащая
нулевого символа и символа косой черты ("/"). Рекомендуется
ограничиться символами, входящими в переносимый набор символов имен файлов.
Регистр букв является значимым.
Создать файл можно командой touch, указав ей в качестве аргумента имя несуществующего
файла. До этого стоит удостовериться, что такого файла действительно не
существует, с помощью команды ls (list — перечислить), выводящей
список файлов, имена которых перечислены в качестве ее аргументов:
Аргумент, начинающийся с
дефиса, называется ключом команды. Большинство стандартных команд могут
применяться с ключами, модифицирующими их действие. Аргумент, не являющийся
ключом, называется операндом:
Ключ -l задает "длинный" формат вывода команды.
Перед списком файлов выводится строка с количеством блоков (обычно
512-байтных), занимаемых перечисленными файлами. Файлу
соответствует при этом строка-список из семи полей (они разделены символом
табуляции, отображаемым при выводе на экран пробелом или серией пробелов,
перечисленных в таблице:
Поле
"Размер" — это размер или длина файла в байтах. Файл был лишь создан,
но ничего не записано в него; такой файл имеет нулевую длину и называется
пустым файлом.
Тем не менее у него есть все атрибуты файла, включая время
последней модификации (в данном случае "последней модификацией"
явилось само создание файла) и собственно имя.
Удалить
существующий файл можно командой rm с именем файла в качестве аргумента:
Каталоги
Если команда ls подается без операндов (т.е. если
она подана без аргументов вообще или только с аргументами-ключами), результатом
станет вывод списка имен всех файлов в текущем каталоге:
Файлы
организуются в файловую структуру, задающую их логическое расположение.
Файловая структура открытых ОС является иерархической: файлы содержатся в
особых файлах — каталогах; каталоги, в свою очередь, могут содержаться в других
каталогах и т.д. Вершиной файловой структуры служит каталог "/", называемый
корневым каталогом файловой структуры.
В открытых ОС
логическая файловая структура независима от физического размещения файлов на
дисках или других носителях. Соответствие физического носителя или его части
(раздела жесткого диска) фрагменту файловой структуры системы
устанавливается в ходе монтирования этого носителя.
Несъемные
носители (например, жесткие магнитные диски), как правило, монтируются в ходе
загрузки ОС по предзаданному сценарию, а
демонтируются, соответственно, в ходе разгрузки. Съемные носители должны
монтироваться после их установки в привод и демонтироваться перед физическим
снятием. Монтирование носителя — административная процедура, но на настольных
машинах монтирование съемных носителей, как правило, делегируется пользователю,
а некоторые современные ОС (в частности, GNU/Linux) позволяют
его автоматизировать.
Файловую
структуру можно представить в виде дерева с корнем в корневом каталоге и
вершинами во вложенных каталогах. Пример такого дерева изображен в частично
развернутом виде:
Созданный файл 1й_файл, так же, как и
каталог tmp/, выведенный
команды ls, поданной без параметров, находятся в каталоге user/, который, в
свою очередь, находится в каталоге home/, находящемся в корневом каталоге файловой структуры.
Знак "косая черта" ("/") завершает
имя каталога при указании полного или относительного имени файла.
В выводе команды ls -l файлы-каталоги отличаются от обычных файлов тем, что
в первой позиции поля "тип файла и права доступа" стоит буква "d". Тип обычного файла обозначается символом
дефиса ("-").
Полное (или
абсолютное) имя файла однозначно идентифицирует конкретный файл в системе.
Краткое имя однозначно идентифицирует файл лишь в отдельном каталоге. В
вышеприведенном примере каталоги /bin/tmp/ и /home/user/tmp/ имеют совпадающие краткие имена, но различные пути к
ним (путем называется часть полного имени, исключающая краткое имя);
соответственно, различаются и их полные имена.
Полное
(абсолютное) имя в документации всегда указывается с ведущим слэшем (начинается с "/"); таким же образом его
следует указывать и в качестве аргумента команд ОС.
При знакомстве с
командами ls, touch, rm, мы указывала имя файла 1й_файл без ведущего слэша
(и без указания каталога вообще). Такое именование называется относительным.
При относительном указании имени файла путь к нему указывается относительно
текущего каталога. Текущий (рабочий) каталог оболочки определен в каждый момент
времени (при вводе каждой команды).
При регистрации
пользователя текущим становится домашний каталог пользователя, определенный
администратором при создании учетной записи, этого пользователя. Обычно
домашние каталоги пользователей создаются в каталоге /home/ с именами,
совпадающими с регистрационными именами пользователей. Для пользователя
домашним будет каталог /home/user/. Узнать свой домашний каталог пользователь может в
любой момент, подав команду echo ~.
В простейшем
случае относительное имя файла совпадает с его кратким именем. В примерах с
командами ls, touch, rm выше все имена указывали
на файлы в текущем каталоге, которым был домашний каталог пользователя (полное
имя этого каталога /home/user/), поэтому выводилась
информация о файлах, создавался файл и удалялся файл в этом каталоге.
Отдельный
пользователь, в зависимости от цели, с которой он пользуется системой, может
работать с десятками, сотнями, тысячами и более файлов. Держать их все в
рабочем каталоге неудобно, поскольку пришлось бы придумывать и применять весьма
сложные системы их именования. Разумнее рассредоточить их по каталогам,
вложенным в свой рабочий каталог.
Создать каталог можно командой mkdir, а удалить пустой (не
содержащий файлов) каталог — командой rmdir (mkdir - make directory, а rmdir - remove directory) с именем каталога в
качестве параметра:
Сделать каталог текущим можно
командой cd (change directory) с именем каталога в
качестве параметра:
После
смены текущего каталога, его краткое имя появилось в подсказке. Узнать полное
имя текущего каталога можно, подав команду pwd без параметров.
Подавая команду
перехода в каталог, мы использовали его относительное имя, совпадающее в данном
случае с его кратким именем. Но могли указать и его полное имя.
Вернуться обратно (т.е. сменить текущий каталог снова на /home/user/) можно, указав его полное имя. Есть способ проще:
"подняться" на одну ступень по иерархии каталогов можно, использовав специальное имя каталога "..",
содержащееся в любом каталоге. Мы не видели его в списках файлов, выводившихся
по команде ls, поскольку это имя начинается с точки и,
соответственно, файл является "скрытым". Увидеть имена скрытых
(наряду с прочими) файлов можно командой ls
–а:
В
данном случае "пустой" каталог содержит два файла-каталога - "." и "..", первый из которых
является самим каталогом, в котором он содержится, а второй — каталогом на
ступень выше в иерархии. Обратите внимание, что два ключа (например, -а и -l)
можно указать и в сокращенной форме — дефис и следующие за ним буквы ключей без
пробела (в данном случае -al).
И, наконец,
перейти в домашний каталог из любой вершины в файловой структуре можно командой
cd без параметров.
Копирование,
перемещение, переименование файлов
Командой ср можно скопировать файлы, командой mv -
переименовать (переместить) их. Обе эти команды имеют два отличающихся по
семантике варианта.
1) Если последним операндом является имя существующего каталога,
то файлы, имена которых указаны в качестве предшествующих операндов, копируются
или перемещаются в этот каталог.
2) Если последним операндом является имя обычного файла,
то файл, имя которого указано в качестве предшествовавшего операнда, копируется
или переименовывается в этот файл:
Указание в этих
командах единственного операнда, а также указание более двух операндов в
случае, если последний из них не является именем существующего каталога, -
ошибка.
Чтобы избежать
случайного удаления файлов, если при копировании или перемещении файлов их
имена совпадают с именами существующих, можно использовать ключ –i:
Генерация
имен файлов
В качестве
операндов чаще всего выступают имена файлов, и во многих случаях операцию
желательно выполнить не над одним, а над целым списком файлов. Стандартная
оболочка реализует особый механизм для указания списков имен файлов, если эти
имена формально-синтаксически
схожи (начинаются с одной буквы, заканчиваются одним расширением и т.п.). Этот
механизм называется "глоббингом",
генерацией имен файлов или раскрытием метасимволов в именах. Он заимствован и
многими альтернативными системами, но в отличие от большинства из них в
открытых системах раскрытие метасимвола осуществляется оболочкой, а не
командой.
Вопросительный знак ("?") соответствует любому одному символу в имени
файла. Если у нас в каталоге присутствуют файлы al, а2, а3, b , b2, b3, aa1, шаблон имени (метаимя)
"а?" раскроется в список al
a2 а3, а шаблон
"?1" — в a1 b1.
Звездочка
(астериск "*") соответствует последовательности из нуля или большего
количества любых символов. В том же каталоге "а*" раскроется в список
al а2 а3 aa1, а
"*1" - в a1 b1 aa1.
Метаконструкция из последовательности символов, заключенных в
квадратные скобки ( "[" и "]" ),
соответствует любому одному символу из этой последовательности. В том же
каталоге " [abc]
2" раскроется в список а2 b2.
В квадратных
скобках могут содержаться диапазоны, разделенные дефисом
("-"). Они означают любой символ, входящий в этот диапазон, с
учетом алфавитного порядка следования символов. В нашем каталоге " [а-с]
3" раскроется в а3 b3.
Список может быть
предварен знаком отрицания (сиркумфлекс, "^"), в этом случае он означает любой символ, не
входящий в список. Если в шаблон нужно буквально включить символ "-", его следует поставить на первое или последнее
место, а "^" - на любое место, кроме первого.
Конструкция в
квадратных скобках может быть сколь угодно сложной (например, " [a-ckw-z] "
означает — «любой символ с "а" по "с", или "к",
или с "w" no "z"»), и она
всегда соответствует одному символу в раскрываемых именах.
Вопросительные
знаки, звездочки и квадратно-скобочные конструкции могут произвольно
сочетаться. Список всегда раскрывается в алфавитном порядке.
В примере создают
каталог с перечисленными выше файлами и получают списки файлов, соответствующих
некоторым из перечисленных шаблонов:
Еще одним
полезным метасимволом является тильда ("~"), выступающая
в качестве такового только в случае, когда стоит первой в аргументе. Отдельная
тильда раскрывается в полное имя домашнего каталога текущего пользователя.
Тильда, за которой следует (без пробела) регистрационное
имя пользователя, раскрывается в полное имя его домашнего каталога. Если
оболочке не удается раскрыть метасимвол, он передается команде в буквальном виде:
Экранирование
специальных символов
Специальное
значение символов "?", "*",
"[", "]", "~" при указании имен файлов и
является причиной, по которой их (а также другие символы, имеющие специальное
значение для оболочки) не рекомендуется вводить в имена файлов. Однако
пользователь может столкнуться с ситуацией, в которой ему все же нужно
выполнить некоторые действия с файлом, чье имя содержит такие символы.
В каталог Старыефайлы/ перенесен файл Домашняя
страница[13].htm. Как к нему обратиться?
Буквальное
указание в командной строке цепочки символов, совпадающей с именем файла,
очевидно, не приведет к разумному результату, поскольку будет интерпретировано
как список, состоящий из имени "Домашняя" и шаблона "страница
[13].htm"
(которому могут соответствовать файлы страница1.htm и страницаЗ.htm).
В лучшем случае
эти файлы не будут найдены, в худшем будут найдены другие файлы, чьи названия
случайно совпадут с элементами невольно введенного "списка" или
результатами раскрытия "шаблона".
Чтобы указать в
командной строке файл, чье имя содержит специальные символы, эти символы
необходимо экранировать, т.е. "защитить" от раскрытия. Экранировать
отдельный символ можно, поставив перед ним символ обратной косой черты ("\", "бэкслэш").
Цепочка "Домашняя\ страница\
[13\] .htm"
раскрывается в цепочку "Домашняя страница [13] .htm":
Экранировать бэкслэшем можно любой специальный символ. Если необходимо,
чтобы в цепочке был раскрыт сам символ "\", он также экранируется:
Другой способ
экранировать специальные символы от интерпретации как шаблонных
- заключить имя файла целиком в апострофы или кавычки:
Экранирование
апострофами несколько отличается от экранирования кавычками.
Хотя, используя
экранирование, можно создавать, перемещать, копировать и уничтожать файлы, имена
которых состоят практически из любых символов, включать специальные (как
шаблонные, так и прочие) символы в имена файлов крайне не рекомендуется, так
как это заметно повышает вероятность ошибки при вводе.
Оболочка не
придает никакого особого значения точке в имени файла (кроме случаев, когда имя
начинается с точки), и "расширение имени файла" — это лишь
интерпретация пользователя (и, возможно, некоторых программ). Поэтому, в
отличие от ряда альтернативных систем, шаблон "*." означает не “все
файлы с именами без расширений", но буквально "все файлы с именами,
заканчивающимися на точку”.