Убунтология

Популярное содержимое

Файлы и каталоги

 

Автор статьи: SergeA

 

 

Краткое вступление

Файл – это основная структурная единица хранения информации, но что мы о нем знаем?

Итак, из времени DOS мы помним, что файл – это поименованная область на диске, т.е. файл имеет имя и адрес, который записывается в особую область – таблица размещения файлов (FAT).

В дремучие времена файлы именовались по принципу 8+3, т.е. 8 символов на имя, и 3 символа на расширение. Мы помним про различные типы файлов *,exe, *.com, *.txt, *.sys и т.д. и эти расширения определяли поведение ОС при их запуске, например exe файл – это программа. Помимо расширений у файлов в DOS есть атрибуты: скрытый, системный и архивный. Вот, собственно и все, что можно сказать по поводу файлов, только в Windows длина имени стала 256 символов, что, несомненно, удобно, а как обстоит дело с именами файлов в линуксе:

Имена файлов

Максимальная длина имени 255 символов включая пробелы и спецсимволы, но, в отличие от Windows, Linux чувствителен к регистру, а это значит что имена: file, File и FILE - три разных файла! Пробелы можно использовать в имени файла, но при вызове такого имени через терминал, перед пробелом необходимо поставить экранирующий символ "\" или заключать в двойные кавычки.

Символы: "{ } * ? ' " [ ] \" не рекомендуется использовать в имени файла.
При использовании таких символов в имени, при вызове файла через командную строку - пред ними необходимо ставить экранирующий символ - косую черту \

Например, мы создали в Nautilus файл с именем file link.

file link - в командной строке так писать нельзя - интерпретатор воспримет это как 2 файла file и link, ибо через пробел перечисляются файлы или параметры!

Например команда touch file link - создаст 2 файла file и link, хотите чтобы это был один файл - пишите так: touch file\ link

Если в имени есть спецсимвол например "*", то пишут так: file\*link - это чтобы оболочка правильно восприняла имя file*link, допускается также взять неудобное имя файла в двойные ковычки - touch "file*link".

Симол "/" - нельзя использовать в имени ни при каких обстоятельствах - т.к. это часть пути к файлу.

Символ "-" - не рекомендуется использовать в начале имени файла, но при необходимости поступают так: touch -- -file.

Примечание: Вы можете создать файл со всеми спецсимволами, кроме, "/" в файловом менеджере ГНОМа.

Файлы в Windows – лишь единица информации, а теперь рассмотрим, чем являются файлы в линуксе.

Жесткие ссылки

Известное изречение гласит - в линуксе (и всех юникс системах) - всё файлы, абсолютно всё.

Файлы в линуксе – это не только ваши документы, фильмы и музыка, это и устройства (да, да, не удивляйтесь, в линуксе все устройства, дисководы, модемы и пр. являются файлами), и процессы в памяти, и каталоги и дисковые разделы – абсолютно всё – файлы. Значит наши знания о файлах из DOS/Windows здесь уже явно недостаточны, мало того ущербны – попробуем восполнить пробелы.

Итак, файл в линуксе определяется не именем (его может вообще не быть - временный файл), а особым номером – индексным дескриптором i-node - он является уникальным для каждого файла в пределах одной файловой системы, и повторяться не может.

Возникает закономерный вопрос – а как же мы обращаемся к файлу, если имя не является его основным атрибутом? Мы обращаемся к файлу посредством так называемых жестких ссылок, т.е. прямых ссылок на файл с соответствующим i-node, и здесь, внимание, - жестких ссылок может быть сколько угодно! Если в Windows имя и абсолютный путь файла является единственным определяющими его атрибутами, то в линуксе все в корне отличается. Жесткая ссылка не является самим файлом, а лишь ссылается на него. Если вы удаляете жесткую ссылку, то файл считается стертым, а если жестких ссылок несколько – то их число просто уменьшается на единицу, а файл остаётся на месте!
Рассмотрим пример. Для этого заведем отдельный каталог и перейдем в него:

serg@serg:~$ mkdir work
serg@serg:~$ cd work

1. создадим файл file, и запишем в него какой-нибудь текст:

serg@serg:~/work$ touch file
serg@serg:~/work$ echo "sometext">file
serg@serg:~/work$ cat file
sometext

Мы создали файл с именем file и записали в него строчку sometext, что и показала команда cat.

2. Теперь создадим жесткую ссылку на него:

serg@serg:~/work$ ln file file.hardlink

и посмотрим, что получилось, для этого запустим команду ls с ключами –l (показывать все атрибуты файла) и ключом –i (показывать номера i-node)

serg@serg:~/work$ ls -li
479934 -rw-r--r-- 2 serg serg 9 2009-05-06 21:17 file
479934 -rw-r--r-- 2 serg serg 9 2009-05-06 21:17 file.hardlink

Что мы видим – файлы file и file.hardlink имеют одинаковый номер i-node - 479934, а число жестких ссылок, равно 2, это значит что это file и file.hardlink не два разных файла, а один, только на него ссылаются дважды.

3. Удалим наш исходный файл:

serg@serg:~/work$ rm file
serg@serg:~/work$ ls -li
479934 -rw-r--r-- 1 serg serg 9 2009-05-06 21:17 file.hardlink

Что мы видим – нашего «исходного» файла уже нет, но созданная нами жесткая ссылка имеет номер i-node, как у исходного файла.

Это значит, что, удалив одну из жестких ссылок на файл, сам файл остался на месте, просто теперь число жестких ссылок равно 1, а чтобы убедиться, что это наш файл — просмотрим его содержимое:

serg@serg:~/work$ cat file.hardlink
sometext

Если мы удалим и вторую ссылку, т.е. file.hardlink, то наш файл будет окончательно стерт.

А теперь практическое применение всего выше сказанного.

Представим, у нас есть ценный файл, который мы боимся случайно стереть, согласно мышлению рядового пользователя, мы сделали бы его копию и поместили куда-нибудь подальше (правда в этом случае возникает одно неудобство — синхронизация содержимого исходного файла и его копий). Если файл маленький, то беды в этом нет, а если его размер 1 ТБ (например, база данных сервера), и такую копию просто некуда поместить - то файл вынужденно будет в единственном экземпляре – стерли, и его не стало. В линуксе мы создадим на него жесткую ссылку и скопируем ее в любой другой каталог – теперь даже при случайном «удалении» нашего суперфайла (а мы знаем, что команда rm самих файлов не трогает, а лишь удаляет жесткие ссылки на них), он никуда не денется, просто число жестких ссылок на него уменьшится на 1.

Удобно, не правда ли?

Примечание: В Windows тоже имеется возможность создания жестких ссылок.

Символические ссылки

Жесткие ссылки несомненно удобны, но есть одно «но» - их можно создавать только в пределах одной файловой системы, а это значит, что нам не удастся создать жесткую ссылку в домашнем каталоге на файл с флешки или сетевого диска. А как же быть, если требуется работать с файлом, а каждый раз вводить полный путь к нему неудобно – для этого существуют символьный ссылки, это полный аналог ярлыков в Windows (даже стрелочки такие же).

Создадим символьную ссылку, но для этого надо «восстановить» удаленный файл file:

serg@serg:~/work$ ln file.hardlink file
serg@serg:~/work$ ls -li
479934 -rw-r--r-- 2 serg serg 9 2009-05-06 21:17 file
479934 -rw-r--r-- 2 serg serg 9 2009-05-06 21:17 file.hardlink
serg@serg:~/work$ ln -s file file.simlink
serg@serg:~/work$ ls -li
479934 -rw-r--r-- 2 serg serg 9 2009-05-06 21:17 file
479934 -rw-r--r-- 2 serg serg 9 2009-05-06 21:17 file.hardlink
479940 lrwxrwxrwx 1 serg serg 4 2009-05-06 21:30 file.simlink -> file
serg@serg:~/work$ cat file.simlink
sometext

Что мы видим - i-node у файлов file и file.simlink разные (479934 и 479940) а значит - это разные файлы. Символьная ссылка – это отдельный файл, содержащий информацию о файле, на который он ссылается — при просмотре содержимого символьной ссылки file.simlink мы видим текст sometext, который содержится в исходном файле file. О том, что файл, является символьной ссылкой, говорит значок "->". Символьная ссылка лишена ограничений, присущих жестким ссылкам – её можно создать на файл, находящийся где угодно. А в чем же отличие, спросите вы, а отличие в том, что символьная ссылка, с исходным файлом никак не связана — это отдельный файл, указывающий на файл исходный.

Удалим исходный файл:

serg@serg:~/work$ rm file
serg@serg:~/work$ ls -li
479934 -rw-r--r-- 1 serg serg 9 2009-05-06 21:17 file.hardlink
479940 lrwxrwxrwx 1 serg serg 4 2009-05-06 21:30 file.simlink -> file
serg@serg:~/work$ cat file.simlink
cat: file.simlink: No such file or directory


Мы видим, что символьная ссылка осталась, только теперь она никуда не ведет: No such file or directory, то же самое будет и при удалении файла в Windows, на который был создан ярлык.

Примечание: символические ссылки нельзя переносить в другие каталоги - они перестают работать.

Каталоги

Теперь на очереди каталоги – что же это такое?

В среде Windows нам прививали понятия документ - папка, т.е. файл это документ, а каталог (папка) это вместилище файлов. Сейчас остановитесь и подумайте, а в линуксе так может быть? - нет, нет и еще раз нет, а потому что файлы не «хранятся» в папках – иначе КАК один и тот же файл может ОДНОВРЕМЕННО присутствовать в разных местах (если не поняли о чем я, то еще раз перечитываем про жесткие ссылки). Итак, каталог в линуксе это…файл, только этот файл содежит описания файлов, которые в нем находятся. Поэтому аналог понятия папки, как в Windows, здесь в корне не верен, каталог – это скорее библиотечный ящичек с карточками на различные книги, а сами книги (т.е. файлы) хранятся на полках библиотеки, а карточки на одну и ту же книгу могут одновременно лежать в разных ящичках.

Примечание: В Windows каталог также является ссылкой на определенный диапазон дискового пространства, отличаются только понятия.

Чтобы лично убедиться в этом - создадим каталог и переместим в него одну из жестких ссылок на наш файл:

serg@serg:~/work$ mkdir directory
serg@serg:~/work$ ls -li
479944 drwxr-xr-x 2 serg serg 4096 2009-05-06 21:43 directory
479934 -rw-r--r-- 2 serg serg    9 2009-05-06 21:17 file
479934 -rw-r--r-- 2 serg serg    9 2009-05-06 21:17 file.hardlink
479940 lrwxrwxrwx 1 serg serg    4 2009-05-06 21:30 file.simlink -> file
serg@serg:~/work$ mv file.hardlink directory/
serg@serg:~/work$ ls -li
479944 drwxr-xr-x 2 serg serg 4096 2009-05-06 21:44 directory
479934 -rw-r--r-- 2 serg serg    9 2009-05-06 21:17 file
479940 lrwxrwxrwx 1 serg serg    4 2009-05-06 21:30 file.simlink -> file
serg@serg:~/work$ cd directory/
serg@serg:~/work/directory$ ls -li
479934 -rw-r--r-- 2 serg serg 9 2009-05-06 21:17 file.hardlink

Что мы видим — файлы с ОДИНАКОВЫМ i-node (479934) лежат в разных местах, а это значит что файлов не два а один. Сам каталог - это тоже файл (479944 drwxr-xr-x 2 serg serg 4096 2009-05-06 21:43 directory) со своим i-node и двумя жесткими ссылками - внешняя и внутренняя (текущий каталог "./"). Если создать еще один вложенный каталог, то у нашего каталога появится третья жесткая ссылка и имя ".." - каталог уровнем выше.

Допустим что наш основной рабочий документ это file.hardlink - удалим его вместе с каталогом (как бы случайно):

serg@serg:~/work$ pwd
/home/serg/work/directory
serg@serg:~/work/directory$ cd ..
serg@serg:~/work$ rm -rf directory
serg@serg:~/work$ ls
file  file.simlink
serg@serg:~/work$ cat file
sometext

Наш рабочий файл (file.hardlink) мы удалили вместе с каталогом (такое иногда бывает), в котором он лежал
(/home/serg/work/directory), но(!) у нас была еще одна жесткая ссылка (file), поэтому наша работа не потеряна, что и показала команда cat.

Видите, как просто и удобно линукс работает с файлами.

Типы файлов

И наконец рассмотрим основные типы файлов на фагменте вывода команды ls -l из предыдущего примера:

479944 drwxr-xr-x 2 serg serg 4096 2009-05-06 21:44 directory
479934 -rw-r--r-- 2 serg serg    9 2009-05-06 21:17 file
479940 lrwxrwxrwx 1 serg serg    4 2009-05-06 21:30 file.simlink -> file

Первый символ в строке прав доступа и означает тип файла:

- - обычный файл или жесткая ссылка (что равнозначно)
d - каталог
l - символьная ссылка


Но это далеко не все существют и еще:

b - файл блочного устройства. Обозначаются символом
c - файл символьного устройства. Обозначаются символом
р - fifo (first input first output) или именованный канал pipe
s - socket (соединение)