Каталоги
Если бы файловая структура не позволяла использовать ничего кроме просто имен файлов, даже сколь угодно длинных (т. е. все файлы располагались бы в одном общем списке), то обращаться к ним было бы чрезвычайно трудно. Вообразите себе список из нескольких тысяч файлов! Поэтому файлы группируются в каталоги, которые, в свою очередь, могут быть включены в другие каталоги. В результате получается иерархическая структура каталогов, начинающаяся с корневого каталога. Каждый (под)каталог может содержать как отдельные файлы, так и подкаталоги.
Иерархическую структуру каталогов обычно иллюстрируют рисунком "дерева каталогов", в котором каждый каталог изображается узлом "дерева", а файлы - "листьями". В MS Windows или DOS каталоговая структура строится отдельно для каждого физического носителя (т. е., имеем не отдельное "дерево", а целый "лес") и корневой каталог каждой каталоговой структуры обозначается какой-нибудь буквой латинского алфавита (отсюда уже возникает некоторое ограничение). В Linux (и UNIX вообще) строится единая каталоговая структура для всех носителей, и единственный корневой каталог этой структуры обозначается символом "/". В эту единую каталоговую структуру можно подключить любое число каталогов, физически расположенных на разных носителях (как говорят, "смонтировать файловую систему" или "смонтировать носитель").
Имена каталогов строятся по тем же правилам, что и имена файлов. И, вообще, каталоги в принципе ничем, кроме своей внутренней структуры (до которой ОС уже есть дело) не отличаются от "обычных" файлов, например, текстовых.
Полным именем файла (или путем к файлу) называется список имен вложенных друг в друга подкаталогов, начинающийся с корневого каталога и оканчивающийся собственно именем файла. При этом имена подкаталогов в этом списке разделяются тем же символом "/", который служит для обозначения корневого каталога. Например, на моем компьютере /home/kos/ve/book/filesystem1.htm является полным именем того файла, в котором я сохранил первый вариант данного текста.
В каждый момент времени пользователь работает с одним экземпляром оболочки shell и эта оболочка хранит значение так называемого "текущего" каталога, т. е. того каталога, в котором пользователь сейчас работает. Имеется специальная команда, которая сообщает вам значение текущего каталога - pwd.
Примечание Если быть более точным, то следует сказать, что текущий каталог - это понятие, относящееся к каждому запущенному в системе процессу (в частности к оболочке); поэтому иногда запуск какой-то программы в shell может привести к тому, что после завершения работы этой программы текущий каталог сменится. |
Кроме текущего каталога для каждого пользователя определен еще его "домашний каталог" - каталог, в котором пользователь имеет все права: может создавать и удалять файлы, менять права доступа к ним и т. д. В каталоговой структуре Linux домашние каталоги пользователей обычно размещаются в каталоге /home и имеют имена, совпадающие с именем пользователя. Например, /home/jim. Каждый пользователь может обратиться к своему домашнему каталогу с помощью значка ~, т. е., например, пользователь jim может обратиться к каталогу /home/jim/doc как к ~/doc. Когда пользователь входит в систему, текущим каталогом становится домашний каталог данного пользователя.
Для изменения текущего каталога служит команда cd. В качестве параметра этой команде надо указать полный или относительный путь к тому каталогу, который вы хотите сделать текущим. Понятие полного пути уже было пояснено, а понятие относительного пути требует дополнительного пояснения. Относительным путем называется перечисление тех каталогов, которые нужно пройти в "дереве каталогов", чтобы перейти от текущего каталога к какому-то другому каталогу (назовем его целевым). Если целевой каталог, т. е. каталог, который вы хотите сделать текущим, расположен ниже текущего в структуре каталогов, то сделать это просто: вы указываете сначала подкаталог текущего каталога, затем подкаталог того каталога и т. д., вплоть до имени целевого каталога. Если же целевой каталог расположен выше в каталоговой структуре, или вообще на другой "ветви" дерева, то ситуация несколько сложнее. Конечно, можно было бы пользоваться полным путем, но тогда придется записывать очень длинные маршруты.
Эта трудность преодолевается следующим образом. Для каждого каталога (кроме корневого) в дереве каталогов однозначно определен "родительский каталог". В каждом каталоге имеются две особых записи. Одна из них обозначается просто точкой и является указанием на этот самый каталог, а вторая запись, обозначаемая двумя точками, - указатель на родительский каталог. Эти имена из двух точек и используются для записи относительных путей. Чтобы сделать текущим родительский каталог, достаточно дать команду
[user]$ cd ..
А чтобы перейти по дереву каталогов на два "этажа" вверх, откуда спуститься в подкаталог kat1/kat2 надо дать команду
[user]$ cd ../../kat1/kat2
Команда ls служит для вывода на экран списка имен файлов и подкаталогов текущего каталога. Нужно отметить, что фактически команда ls просто выводит содержимое файла, который описывает данный каталог, и не происходит никаких обращений к самим файлам. Любой каталог, как уже говорилось, - это обычный файл, в котором перечислены все файлы и подкаталоги этого каталога.
Примечание Задумайтесь, кстати: нет никаких особых "ящиков с файлами", есть просто файлы-списки, которые причисляют данный файл к определенному каталогу. |
Кроме имени файла (или подкаталога) запись о нем в соответствующем каталоге содержит еще массу информации об этом файле. Для того, чтобы получить эту информацию, надо использовать дополнительные параметры команды ls. Если дать команду ls с параметром -l, то будут выданы не только имена файлов, но также данные о правах доступа к файлу (подробнее о правах будет рассказано ниже), количество жестких ссылок или имен файла (для каталога указывается число дополнительных блоков)1), имя владельца файла и группы файла, его размер и дата последней модификации. Вот небольшой пример.
[user]$ ls -l итого 1171 drwxrwxr-x 2 kos kos 1024 Jun 20 22:42 NotR drwx------ 2 kos kos 1024 Jun 27 21:02 Star -rw-rw-r-- 1 kos kos 17351 Nov 2 23:59 arch.htm -rw-rw-r-- 1 kos kos 19847 Dec 11 20:23 contents.htm -rw-rw-r-- 1 kos kos 48866 Nov 2 23:59 edit.htm -rw-rw-r-- 1 kos kos 38867 Dec 12 20:58 filesystem1.htm -rw-rw-r-- 1 kos kos 29545 Dec 11 20:23 first_start.htm drwxr-xr-x 3 kos kos 2048 Sep 24 21:33 img -rw-rw-r-- 1 kos kos 21590 Dec 11 19:42 init.htm drwxrwxr-x 2 kos kos 1024 Sep 27 22:35 pic -rw-rw-r-- 1 kos kos 11084 Nov 8 21:26 preface.htm
Если дополнительно задать параметр -i, то в первой колонке будут отображены индексы файлов (номера соответствующих inode). При задании параметра -t сортировка файлов будет производиться не по именам, а по времени модификации файла. Задание параметра -u приводит к тому, что вместо времени модификации файла будет выводиться время последнего доступа к файлу. Параметр -r меняет порядок сортировки на обратный (используется вместе с параметрами -l и -t). Заметим еще, что параметры можно перечислять как отдельно:
[user]$ ls -l -i -r
так и объединять:
[user]$ ls -lir
На этом мы закончим краткое описание команды ls (подробнее см. соответствующую man- или info-страницу) и перейдем к рассмотрению основных каталогов в каталоговой структуре Linux.