Главная » Программирование для UNIX » Снова о файлах: каталоги

0

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

Обычно  у каждого пользователя есть  личный,  или  домашний ката5 лог, который содержит  информацию, принадлежащую только этому пользователю (иногда его еще  называют каталогом регистрации1  (login  directory)).  Войдя  в систему, пользователь попадает в  домашний каталог. Можно изменить каталог, в котором вы работаете, обычно  он называется рабочим, или  текущим каталогом, но домашний каталог всегда  один  и тот же.  Если специально не указано иное, то при  созда нии файла он помещается в текущий каталог. Поскольку изначально это домашний каталог, то файл не имеет  никакого отношения к файлу с таким же  именем, который может существовать в каталоге другого пользователя.

Каталог может включать в себя не только файлы, но и каталоги («Great directories have lesser directories…» – «У больших каталогов есть маленькие каталоги…», как в стихотворении Огастеса Де Моргана). Естественный способ представления структуры файловой системы – это дерево  каталогов и файлов. Внутри этого дерева  можно перемещаться в поиске файла от корня дерева по ветвям и, наоборот, можно начать с того места, где вы находитесь, и двигаться обратно к корню.

Начнем с реализации последней описанной  возможности. Основным инструментом будет  команда pwd  (print working directory –  показать рабочий каталог), которая выводит имя текущего каталога:

$ pwd

/usr/you

$

Это означает, что в настоящее время пользователь находится в каталоге you, который находится в каталоге usr, который, в свою очередь, находится в корневом  каталоге,  который условно обозначается как  /. Символы / разделяют компоненты имени; длина каждого компонента такого имени ограничена 14 символами, как и имя файла.2  Во многих системах /usr  –  это  каталог,  содержащий  каталоги  всех   обычных пользователей системы. (Даже если  домашний каталог и не /usr/you, команда pwd все равно  выведет нечто  подобное,  так  что  приведенные ниже рассуждения подойдут и для этого случая.)

1         Хотя на самом  деле так его не называют никогда. – Примеч. науч. ред.

2         Была ограничена. См. выше. – Примеч. науч. ред.

Если теперь ввести

$ ls /usr/you

должен быть  выведен точно  такой же  список  имен  файлов, который выводился командой ls без параметров. Если  параметры не указаны, то ls выводит содержимое текущего каталога, если же  имя  каталога указано, то команда выдает содержимое именно этого каталога.

Теперь попробуем

$ ls /usr

Будет выведен длинный список имен, среди которых будет и регистрационный каталог you.

Следующим шагом будет попытка вывести содержимое корневого ка талога. Ответ должен быть примерно таким:

$ ls / bin boot dev

etc  lib tmp unix usr

$

(Не путайте два смысла символа /; это и обозначение корневого каталога, и  разделитель  компонентов имени файла.) Почти  все  перечисленные  элементы  представляют  собой  каталоги, но  вот  unix  –  это файл, содержащий ядро  UNIX  в исполняемом виде. Подробно погово рим об этом в главе 2.

Введем команду

$ cat  /usr/you/junk

(если junk еще присутствует в домашнем каталоге). Имя

/usr/you/junk

называется путем к файлу. «Путь к файлу» –  это  название с инту итивно понятным смыслом, означающее полное имя  пути  от корня по дереву  каталогов к конкретному файлу. В системе UNIX  существует универсальное правило –  везде, где  может  использоваться  обычное имя  файла, может использоваться и путевое имя.

Структура файловой системы напоминает генеалогическое дерево. Попробуем пояснить (рис.  1.1).

Файл junk пользователя you не имеет  никакого отношения к файлу с таким  же именем, принадлежащему Полу  (paul) или Мэри (mary).

Рис. 1.1. Дерево  каталогов

Если  все интересующие пользователя файлы находятся в его личном каталоге, то путевые имена не имеют  особого значения, а вот если  он работает вместе  с кем-то или  занимается несколькими проектами одновременно, тут путевые имена становятся действительно полезными. Например, друзья могут распечатать ваш  файл junk, просто  введя команду

$ cat  /usr/you/junk

Аналогично и вы можете, например, просмотреть, какие файлы есть у Мэри:

$ ls /usr/mary

data  junk

$

или сделать себе копию одного из ее файлов:

$ cp /usr/mary/data  data

или даже отредактировать ее файл:

$ ed /usr/mary/data

Если  пользователь не хочет, чтобы  другие копались в его файлах, он может ограничить доступ  к ним. Для  каждого каталога и файла зада ются  права на  чтение-запись-выполнение  для   владельца, группы и всех  остальных,  с  помощью которых можно контролировать  доступ. (Вспомните ls  –l.)   Пользователи   наших  локальных  систем  видят больше преимуществ в открытости, а не в секретности, но для  других систем политика может быть иной. Вернемся к обсуждению этого вопроса в главе 2.

Итак, последняя серия экспериментов с путевыми именами:

$ ls /bin /usr/bin

Похожи ли  полученные названия на  что-то  уже знакомое? Когда  вы вызываете команду, печатая ее имя  в командной строке (после  соответствующего приглашения со стороны системы), система ищет файл с таким именем. Обычно она сначала просматривает текущий каталог (где, вероятно, файл не будет найден), затем каталог /bin и, наконец,

/usr/bin. В командах, подобных cat или ls, нет ничего особенного, кро ме того, что они собраны в нескольких каталогах для простоты поиска и администрирования. Чтобы проверить это, запустите какие-нибудь из подобных программ, указывая их полные путевые имена:

$ /bin/date

Mon  Sep 26 23:29:32  EDT  1983

$ /bin/who

srm

tty1

Sep 26 22:20

cvw

tty4

Sep 26 22:40

you

tty5

Sep 26 23:04

$

Упражнение 1.3. Введите

$ ls /usr/games

и сделайте, что первым придет в голову. В нерабочее время некоторые вещи выглядят забавнее. ~

Переход в другой каталог – cd

Если  регулярно возникает необходимость  работы с информацией из каталога другого пользователя, можно сказать, например: «Я хочу работать не со своими файлами, а с файлами Мэри». Такое пожелание реализуется с помощью изменения текущего каталога командой cd:

$ cd /usr/mary

Если  теперь в  качестве аргументов команд cat  или  pr  использовать имена файлов без  указания  полного пути, то подразумеваться  будут файлы из каталога, принадлежащего Мэри. Переход к другому каталогу никак не влияет на права доступа к файлу – если файл был недоступен  из домашнего каталога, то переход в другой каталог этого факта не изменит.

Обычно бывает удобно организовать свои файлы таким образом, чтобы  все,  относящееся к одному проекту, находилось в одном  каталоге, отдельно от других проектов. Например, кто-то, кто  пишет книгу, может  поместить  все  тексты в каталог под  названием book  (книга). Команда mkdir создаст новый каталог.

$ mkdir  book             Создать каталог

$ cd book                  Перейти в него

$ pwd                               Убедиться, что переход осуществлен правильно

/usr/you/book

…               Написать книгу (займет некоторое время)

$ cd ..           Подняться на один уровень файловой системы

$ pwd

/usr/you

$

Две точки .. обозначают родительский каталог для  текущего каталога, то  есть  каталог,  находящийся уровнем выше (ближе к корню). Одна точка . обозначает текущий каталог.

$ cd                              Вернуться в домашний каталог

вернет вас в домашний (регистрационный) каталог.

Как только книга опубликована, все файлы можно стереть. Чтобы удалить  каталог book, удалите все содержащиеся в нем файлы (позже будет рассказано о том,  как сделать это быстро), потом  перейдите (cd) в родительский каталог для  book и введите:

$ rmdir  book

Команда rmdir удаляет только пустые каталоги.

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии