Раздел 2

ФАЙЛОВАЯ СИСТЕМА ОС UNIX

Обзор

В ОС UNIX вся информация размещается в файлах. Каждый файл имеет имя и принадлежит одному из четырех типов: обычный файл, каталог или специальные. Файлы организованы в файловую систему. В этом разделе объясняется иерархическая организация файловой системы ОС UNIX. Вы познакомитесь с командами, которые позволяют маневрировать в файловой системе

ЦЕЛИ

1.Описать четыре главных типа файлов в ОС UNIX.
2.Именовать файлы в соответствии с правилами ОС
UNIX.
3.Описать иерархию каталогов в ОС
UNIX.
4.Описать назначение вашего каталога
login.
5.Находить рабочий каталог командой
pwd.
6.Перемещаться по файловой системе с помощью команды
cd.
7.Описать полный и частичный пути.
8.Выполнять команду
ls с опциями для получения списков файлов.
9.Определить содержание файла с помощью команды
file.
10.Находить файл в иерархической системе с помощью команды
find.

Файлы ОС UNIX

В ОС UNIX файл - это любая информация, такая как письмо, отчет доклад, программа и т.д., которую вы храните. Файл имеет несколько частей: имя , содержание и индексный дескриптор inode (information node). В индексном дескрипторе хранится служебная и системная информация такая как длина файла, место хранения содержания файла на диске и т.д.

Существует четыре основных типа файлов: обычный файл (regular), каталог (directory), специальный (special) и символическая связь (symbolic link).

Обычный файл содержит тексты заметок, программ или числа. Как правило, такие файлы вы создаете редактором (например, vi) или текстовым процессором. Обычные файлы могут быть исполняемыми. Один тип исполняемых файлов - это shell программа, содержащая командные строки подобные тем, что вы вводите в ответ на приглашение shell. Другой тип выполняемого файла - это откомпилированная программа, которая содержит команды, переведенные с языка программирования высокого уровня (например, C) на машинный язык. Большинство команд ОС UNIX - это откомпилированные программы.

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

Специальные файлы - это файлы устройств, таких как терминалы, диски, принтеры, ленточные устройства. Системный администратор обычно создает новые специальные файлы, когда в систему добавляется новое оборудование. Специальный файл связан с устройством.

Символическая связь - это файл, содержащий инструкции, которые указывают на другой файл. Символические связи могут связывать файлы в разных файловых системах. Они также помогают сохранять более старые имена каталогов совместно с более новыми. Например, в ранних версиях ОС UNIX каталог news был организован в каталоге usr. Сейчас каталог news символически связан с каталогом news, находящемся в каталоге var.

В отличие от других языков программирования в ОС UNIX не требуется объявлять тип и резервировать место для файла перед его использованием. Нет также основанных на имени файла ограничений на его содержание.

ФАЙЛЫ ОС UNIX

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

Имена файлов

Когда вы создаете файл, вы должны выбрать для него имя. Имя файла должно отражать его содержание. При именовании файла вы МОЖЕТЕ использовать:

Так как некоторые символы имеют специальное значение в командной строке, избегайте использования:

ls с опцией -a

Имена административных файлов обычно начинаются с точки (.). Эти имена не появляются когда вы получаете список файлов командой ls. Для получения списка файлов, включающего имена , начинающиеся с точки, используйте опцию -a:

$ ls -a<RET>

    .          bin      fun       numbers seepath unit4    unit7
.. books groceries one line single unit5 unit8
.news_time calendar lunch file perm unit10 unit6 unit9
.profile echoit names phone unit3 unit6old
$

.news_time - это пустой файл, который действует как штемпель даты для команды news. Дата файла показывает, когда вы последний раз читали новости, так что любые более ранние новости не рассматриваются как текущие.

ИМЕНА ФАЙЛОВ -- ПРАВИЛА

ОБОСНОВАННЫЕ ИМЕНА ФАЙЛОВ:

note

new_mail
Update.86
README
.profile


ИЗБЕГАЙТЕ ЭТИХ ИМЕН:

John_rubenstein
Mail Box
Sue'snotes
AT&T

Файловая система ОС UNIX

Все файлы являются частью файловой системы ОС UNIX. Эта система является иерархической совокупностью каталогов и других файлов, имеющей древоподобную структуру. С иерархической структурой вы, вероятно, знакомы по организационной схеме компании.

         

                      President
                          |
   ______________________________________________
   |              |              |              |
Vice-Pres1     Vice-Pres2     Vice-Pres3     Vice-Pres4
                  |
    ____________________________
    |             |            |
 Manager1      Manager2     Manager3
                               |
                          Supervisor1

Эта структура имеет одну исходную точку - президент. Ниже идет второй уровень - вице-президентов, третий уровень - управляющих, четвертый - руководителей и т.д.

Аналогично структуре компании файловая система ОС UNIX имеет одну исходную точку, называемую корень (root). Корневой каталог представлен косой чертой (/). Файловая система имеет только один корень. Области ниже корневого каталога включают другие каталоги, обычные файлы и специальные файлы.

Вообще, структура файловой системы ОС UNIX называется перевернутым деревом. Каталоги рассматриваются как части дерева, а обычные и специальные файлы - как его листья.

ФАЙЛОВАЯ СИСТЕМА ОС UNIX

Некоторые стандартные каталоги

Типичная файловая система ОС UNIX имеет каталоги:

НЕКОТОРЫЕ СТАНДАРТНЫЕ КАТАЛОГИ

Каталог входа и команда pwd

Когда вы первый раз входите в систему, она помещает вас в каталог, называемый вашим входным каталогом. Это ваша собственная подсистема или поддерево. Здесь вы можете делать каталоги, создавать файлы, переименовывать и перемещать их и т.д. Вы можете иметь настолько широкую и глубокую древовидную структуру в своей подсистеме, насколько это позволит объем памяти.

Куда бы вы ни перешли в ОС UNIX, вы находитесь в каталоге, который называется текущим или рабочим каталогом. Думайте о вашем текущем каталоге, как о метке "вы - здесь". Когда вы входите в систему, ваш входной каталог является текущим.

Команда pwd

Команда pwd (print working directory), показывает имя текущего каталога, начиная с корня. Например,

$ pwd<RET>

/home/stu2

$

В этом курсе в вашем входном каталоге уже есть созданные файлы. Следующая страница показывает подкаталоги и некоторые файлы вашего входного каталога.

КАТАЛОГ ВХОДА И КОМАНДА pwd

$ pwd<RET>

/home/stu2

$

Команда cd

В зависимости от прав доступа вы можете иметь разрешение на перемещение в другие каталоги и работу с файлами внутри них. Команда перемещения в другой каталог - cd (change directory) с указанием имени пути. Имя пути (path name) описывает маршрут, следуя которому система находит файл. Каждый файл появляется однажды в списке индексных дескрипторов файловой системы и имеет уникальный путь из корневого каталога. Формат командной строки:

cd имя-пути

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

Полностью описанное имя пути - это указание положения файла, начиная от корневого каталога.

Частичное или относительное имя пути - это указание положения файла, начиная от текущего каталога.

Вы должны выбрать надлежащий путь (относительный или полный) иначе система пошлет вам сообщение об ошибке:

path name: does not exist

Возвращение в каталог входа

Для того, чтобы вернуться в ваш каталог входа из любого места файловой системы ОС UNIX, выполните команду cd без аргументов:

$ cd<RET>

$

КОМАНДА cd

ФОРМАТ КОМАНДЫ:

cd имя -пути

имя пути: маршрут, по которому система следует для нахождения файла, т.е. список каталогов, разделенных символами косая черта, заканчивающийся именем желаемого каталога

полностью описанное имя пути: положение файла относительно корня

относительное имя пути: положение файла относительно текущего каталога

команда cd без опций: возвращение в каталог входа

Полностью описанные имена пути

Полностью описанное имя пути или абсолютное имя пути описывает положение каталога, начиная от корня. Это имя пути ВСЕГДА начинается с / (косой черты). Затем следует список каталогов, разделенных символами /, заканчивающийся именем желаемого файла или каталога. Примером полностью описанного имени пути является вывод команды pwd. Например, после изменения каталога на /home/stu2/bin командной строкой:

$ cd /home/stu2/bin<RET>

$ pwd<RET>

/home/stu2/bin

$

Вы можете использовать полностью описанное имя пути всегда, когда вы использовали бы имя файла.

ПРИМЕР 1:

$ cd /bin<RET>

$ pwd<RET>

/bin

$ cat /etc/passwd<RET>

.

$grep ill /home/stu2/unit8/names<RET>

Bill Gaskill

Millicent Zamirowski

$ cd /home/stu2/unit4<RET>

$ pwd<RET>

/home/stu2/unit4

$ ls /home/stu2/fun<RET>

ATTlogo

heart

morefun

thanks

$ pg /home/stu2/books<RET>

.

.

.

$ cd<RET>

$ pwd<RET>

/home/stu2

$

Относительные имена пути

Относительное имя пути, также называемое частичным именем пути описывает положение каталога относительно вашего текущего каталога. Такое имя НИКОГДА не начинается с символа /.

При использовании относительных имен пути вы выбираете каталог в зависимости от, находится ли желаемый каталог выше или ниже вашего текущего каталога.

Чтобы выбрать каталог НИЖЕ текущего, записывают имена каталогов, разделенные символами /, заканчивая именем желаемого файла или каталога. Например, предположим, что вы находитесь в каталоге входа. Чтобы перейти в каталог morefun с помощью относительного имени пути, наберите:

$ cd fun/morefun<RET>

$

Чтобы выбрать каталог ВЫШЕ текущего, используют специальное обозначение .. ("точка точка") для имени родительского каталога. Например, ../.. означает родительский каталог родительского каталога(на 2 каталога выше). Итак:

Предположим, ваш текущий каталог morefun. Вместо набора полностью описанного имени пути /home/stu2/unit8, вы можете перейти в каталог unit8, используя относительное имя пути:

$ cd ../../unit8<RET>

Первые .. ссылаются на родительский каталог fun, следующие .. ссылаются на родительский каталог каталога fun, которым является stu2.

ЗАМЕЧАНИЕ: В каком бы каталоге вы ни находились, текущий каталог всегда "точка" и родительский каталог всегда "точка точка". Вы будете использовать "точку" для установки текущего каталога в команде find позже в этом разделе.

Смотрите пример 1 на следующей странице.

ОТНОСИТЕЛЬНЫЕ ИМЕНА ПУТИ

относительное имя пути: положение файла или каталога относительно текущего каталога

ПРИМЕР 1:

$ cd unit8<RET>

$ pwd<RET>

/home/stu2/unit8

$ ls ../fun/morefun<RET>

terms

twilight.unix

$ cd ../fun<RET>

$ pwd<RET>

/home/stu2/fun

$ grep -i bug morefun/terms<RET>

DEBUG -- Action commonly done by frogs

$ ls ../..<RET>

.

.

.

$ wc ../unit4/work/sep.93<RET>

26 58 543 ../files/unit4/work/sep.93

$ cd ..<RET>

$ pwd<RET>

/home/stu2

$

Список файлов в каталоге

В уроке 3 раздела 1 вы использовали команду ls для получения ASCII упорядоченного списка файлов в каталоге. Эта команда имеет несколько опций, которые могут быть добавлены в командной строке. Например, опция -F печатает символ / после каталогов, звездочку после выполняемых файлов и символ @ после символических связей. Формат команды:

ls -F

Пример на следующей странице показывает каталоги и файлы в текущем каталоге

Списки файлов в других каталогах

Чтобы получить список файлов в другом каталоге, используйте имя пути этого каталога в качестве аргумента команды ls. Пример 2 на следующей странице показывает получение списка файлов в каталоге receivable каталога unit4.

В примере 3 опция -F команды ls показывает, что каталог fun содержит каталог morefun.

В примере 4 опция -F команды ls показывает символически связанные файлы в каталоге /usr.

СПИСОК ФАЙЛОВ В ТЕКУЩЕМ КАТАЛОГЕ

ПРИМЕР 1:

$ ls -F<RET>

bin/     fun        numbers   see     path*     unit4/   unit7/
books    groceries  one       line*   single*   unit5/   unit8/
calendar lunchfile  perm      unit10/ unit6/    unit9/
echoit*  names      phone     unit3/  unit6old/
$

ПРИМЕР 2:

$ ls unit4/receivable<RET>

91_Adams  92_French   92_Reynolds
91_Harris 92_Anderson 92_Johnson
$

ПРИМЕР 3:

$ ls -F fun<RET>

ATT logo heart* morefun/ thanks
$

ПРИМЕР 4:

$ ls -F /usr<RET>

3Bnet/ include/ mail@ options@ sbin/ temp/
adm@ lbin/ net/ preserve@ share ucb/
admin/ lib/ news@ pub@ spool@ ucb include/
bin/ lost+found/ nserve@ sadm/ src/ uclib/
$

Список файлов в каталоге (продолжение)

(a)Общее число блоков диска, занимаемых всеми файлами списка. Это НЕ есть число файлов в каталоге.

(b)Тип файла. Буква d для каталога, - (тире) для обычного файла, буква l для символически связанного файла.

(c)Права доступа к файлу, обозначенные следующими 9-ю символами. Права доступа обсуждаются в разделе 4.

(d)Связи файла. Количество связей - это число каталогов, в списки файлов которых данный файл включается. Для каталогов наименьшее число связей - два, так как каждый каталог включается в свой список файлов и в список родительского каталога. Существует дополнительная связь для каждого подкаталога. Для обычных файлов число связей равно единице (если вы не связываете файлы командой ln, обсуждаемой в разделе 4).

(e)Входной идентификатор владельца файла.

(f)Групповой идентификатор файла. Группы обсуждаются в разделе 4.

(g)Количество байтов (символов) в файле.

(h)Дата и время создания или модификации файла.

(i)Имя файла.

Смотрите пример на следующей странице.

СПИСОК ФАЙЛОВ В КАТАЛОГЕ (ПРОДОЛЖЕНИЕ)

ПРИМЕР 1: опция -l обеспечивает "длинный список" содержания каталога:

$ ls -l<RET>

total25(a)

(b)(c)       (d)       (e) (f) (g)  (h) (i)
  drwxr-xr-x 2slftrain  32 Nov 16 16:26 bin
  -rw-rw---- 1slftrain 200 Nov 16 16:26 books
  -rw-r----- 1slftrain 153 Nov 17 08:32 calendar
  -rwxrwxrwx 1slftrain  38 Jan 16 16:32 echoit
  drwxrwxrwx 3slftrain  96 Nov 17 16:19 fun
  -rw-rw---- 1slftrain 339 Nov 16 16:38 groceries
  -rw-rw---- 1slftrain  48 Nov 16 16:26 lunchfile
  -rw-rw---- 1slftrain 182 Nov 16 16:26 names
  -rw-rw---- 1slftrain   8 Nov 16 16:26 numbers
  -rwxrwxrwx 1slftrain  45 Jan 16 16:33 oneline
  -rw-r--r-- 1slftrain  42 Jan 17 12:52 perm
  -rw-rw---- 1slftrain 646 Nov 16 16:26 phone
  -rwxrwxrwx 1slftrain  11 Jan 16 16:30 seepath
  -rwxrwxrwx 1slftrain  52 Jan 16 16:29 single
  drwxr-xr-x 2slftrain 144 Dec 20 15:24 unit10
  drwxrwx--- 2slftrain 240 Dec 16 15:31 unit3
  drwxrwxrwx 4slftrain 336 Nov 18 08:49 unit4
.
.
.

$

Рекурсивные списки

Опция -R команды ls выводит список содержания текущего каталога, затем списки содержания подкаталогов каждого уровня и т.д. до получения списка всей подсистемы. Формат:

ls -R

Смотрите пример 1 на следующей странице.

РЕКУРСИВНЫЕ СПИСКИ

ПРИМЕР 1:

$ cd<RET>

$ ls -R<RET>

bin/     fun       numbers    see    path*    unit4/   unit7/
books    groceries one        line*  single*  unit5/   unit8
calendar lunch     file       perm   unit10/  unit6/   unit9/
echoit*  names     phone      unit3/ unit6old/

./bin:

./fun: ATT logo heart* morefun/ thanks

./fun/morefun: termstwi light.unix

./unit10: charges* sdata* searcher* staff* temp.c*

./unit3: check.energy energy poem stu.info check.paint light sayings stu.number check.poem paint story wacky

./unit4: budget88 budget90 budget93 budgettot tot budget89 budget91 budget94 poem work/ budget8 totbudget92 budget9 totreceivable/

./unit4/receivable: 91_Adams 91_Somers 92_French 92_Reynolds 91_Harris 92_Anderson 92_Johnson

.
.
.
$

Определение типа файла командой file

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

Перед выводом содержимого файла на экран выполните команду file. Она проверяет первые 512 символов файлов, указанных в качестве аргументов и делает предположение относительно их содержания. Например:

$ file budget90 poem work<RET>

budget90:ascii text
poem:English text
work:directory
$

Замечание: Команда file помечает любой ASCII файл, содержащий знаки пунктуации как "English text".

Другие типы файлов, которые распознает команда file, включают:

Замечание: Если тип файла включает слово "text", вы можете вывести его на экран командой cat.

ОПРЕДЕЛЕНИЕ ТИПА ФАЙЛА, КОМАНДА FILE

команда file: определяет, является ли содержимое файла:

ПРИМЕР 1:

$ file unit4/budget90<RET>

unit4/budget90:ascii text

$ file fun<RET>

fun:directory

$ file unit3/poem<RET>

unit3/poem:English text

$ cat unit3/poem<RET>

DESIDERATA POEM


Anonymous


Go placidly amid the noise and haste and remember what peace thare may be in silence. As far as possible without surrender be on good terms with all persons. Speak your truth quietly and clearly; and hear to others, even the
.
.
.

$ cd<RET>

$ file /usr/bin/who<RET>

/usr/bin/who:3b20 executable

$

Поиск файлов с помощью команды find

Если у вас большая файловая подсистема, вы можете забыть какой каталог содержит нужный вам файл. В этом случае файлы находит команда find. Например:

$ find . -name poem -print<RET>

./unit3/poem

./unit4/poem
$

Эта командная строка означает: начиная с ТЕКУЩЕГО КАТАЛОГА, найти все файлы, НАЗВАННЫЕ poem, и НАПЕЧАТАТЬ их имена пути. СИНТАКСИС на странице find "Справочника пользователя ОС UNIX System V" имеет вид:

find список-имен-пути выражение

Список-имен-пути - это каталог начала поиска. ЗАМЕЧАНИЕ: вы должны указать каталог. Выражения перечислены на странице ОПИСАНИЕ. Вы можете:

Замечание: Начиная поиск с корневого каталога, вы, вероятно, не будете иметь права доступа для поиска каждого каталога. find печатает сообщение о каждом каталоге подсистемы для которого у вас нет права доступа для поиска. Так как такой обширный поиск слишком расточителен, избегайте начинать поиск с корневого каталога без крайней необходимости.

ПОИСК ФАЙЛОВ -- КОМАНДА find

ПРИМЕР 1:

$ find . -name phone -print<RET>

./unit5/phone

./unit6/phone

./unit7/phone

./unit8/phone

./phone

$ find . -print<RET>

.

./unit3

./unit3/energy

./unit3/sayings

.

.

ПРИМЕР 2:

$ find / -name calendar -print<RET>

find: cannot chdir to /home/thd

find: cannot open /home/jbm/wow

find: cannot chdir to /home/bob/stuff

/usr/bin/calendar

find: cannot chdir to /local/admin

/home/srh/calendar

/home/slf/uc1080/units/files/u7/calendar

/home/slf/uc1080/units/files/u8/calendar

.

.

.

Выводы и упражнения

Выводы урока

Типы файлов: обычный, каталог, специальный и символическая связь Имя файла:

Опция ls -a: список служебных файлов, который начинается с точки

Файловая система: организация файлов

Каталог входа: ваша собственная подсистема или поддерево для организации ваших файлов

Команда pwd: вывод имени текущего каталога, начиная с корневого

Команда cd: с именем пути - переход в другой каталог

Имя пути: описание маршрута, по которому следует система для поиска файла

Полностью описанное имя пути: поиск файла или каталога, начиная с корневого

Относительное имя пути: поиск файла, начиная с текущего каталога

Опция ls -F: печать символов / после каталогов, * после выполняемых файлов, @ после символических связей
Опция ls -l: обеспечивает "длинный список" содержания каталогов
Опция ls -R: выводит полный список подсистемы, начиная с текущего каталога
Команда file: определяет, является ли содержание файла:

Команда find: поиск файла, начиная с любого указанного каталога

Упражнение 2.1.А

А. Выполните следующие упражнения на вашем терминале. В пустых строчках запишите командные строки, которые вы вводите, используя полностью описанные имена пути.

1. Выведите содержание каталога news, находящегося в каталоге /var
2. Выведите содержание входного каталога другого обучаемого
3. Выведите содержание вашего каталога
unit3

B. Выполните следующие упражнения на вашем терминале. В пустых строчках запишите командные строки, которые вы вводите, используя относительные имена пути.

1. перейдите в каталог unit6 вашего входного каталога.

a. Выведите ВСЕ содержание этого каталога.
b. Выведите на экран файл с именем
books.
c. Каков тип файла plusx?
d. Какую команду вы используете?

2. Перейдите в ваш каталог receivable.

a. Убедитесь, что вы в каталоге receivable.
b. Выведите "длинное" содержание этого каталога.
c. Выведите содержание файла с именем
92_French.

3. Перейдите в ваш каталог fun.

a. Убедитесь, что вы в вашем каталоге fun.
b. Выведите содержание этого каталога.
c. Выведите содержание файла с именем
heart.

4. Перейдите в ваш каталог unit8.

a. Убедитесь, что вы в этом каталоге.
b. Выведите содержание файла с именем
phone.

5. Вернитесь в ваш входной каталог.

a. Получите рекурсивный список файлов, начиная с вашего входного каталога. Направьте вывод через команду pg, чтобы видеть результат постранично.
b. Начиная с вашего входного каталога, найдите файл с именем
dec.92.
c. Перейдите в каталог, содержащий файл dec.92.

6. Перейдите в родительский каталог вашего входного каталога.

a. Выведите содержание этого каталога.
ЗАМЕЧАНИЕ: ваш входной каталог должен быть в списке среди входных каталогов обучаемых.

7. В каталоге morefun выполните команду banner с вашим именем в качестве аргумента, перенаправив ее выход в файл с именем myname.

a. Выведите содержание каталога morefun, чтобы убедиться, что вы создали файл.
b. Перешлите файл
myname другому обучаемому.
c. Вернитесь в ваш входной каталог.
d. Убедитесь, что вы находитесь в своем входном каталоге