| Файлы и каталоги |
|
Автор статьи: 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 1. создадим файл file, и запишем в него какой-нибудь текст: serg@serg:~/work$ touch file Мы создали файл с именем file и записали в него строчку sometext, что и показала команда cat. serg@serg:~/work$ ln file file.hardlink и посмотрим, что получилось, для этого запустим команду ls с ключами –l (показывать все атрибуты файла) и ключом –i (показывать номера i-node) serg@serg:~/work$ ls -li Что мы видим – файлы file и file.hardlink имеют одинаковый номер i-node - 479934, а число жестких ссылок, равно 2, это значит что это file и file.hardlink не два разных файла, а один, только на него ссылаются дважды. 3. Удалим наш исходный файл: serg@serg:~/work$ rm file Что мы видим – нашего «исходного» файла уже нет, но созданная нами жесткая ссылка имеет номер i-node, как у исходного файла. Это значит, что, удалив одну из жестких ссылок на файл, сам файл остался на месте, просто теперь число жестких ссылок равно 1, а чтобы убедиться, что это наш файл — просмотрим его содержимое: serg@serg:~/work$ cat file.hardlink Если мы удалим и вторую ссылку, т.е. file.hardlink, то наш файл будет окончательно стерт. Представим, у нас есть ценный файл, который мы боимся случайно стереть, согласно мышлению рядового пользователя, мы сделали бы его копию и поместили куда-нибудь подальше (правда в этом случае возникает одно неудобство — синхронизация содержимого исходного файла и его копий). Если файл маленький, то беды в этом нет, а если его размер 1 ТБ (например, база данных сервера), и такую копию просто некуда поместить - то файл вынужденно будет в единственном экземпляре – стерли, и его не стало. В линуксе мы создадим на него жесткую ссылку и скопируем ее в любой другой каталог – теперь даже при случайном «удалении» нашего суперфайла (а мы знаем, что команда rm самих файлов не трогает, а лишь удаляет жесткие ссылки на них), он никуда не денется, просто число жестких ссылок на него уменьшится на 1. Удобно, не правда ли? Символические ссылкиЖесткие ссылки несомненно удобны, но есть одно «но» - их можно создавать только в пределах одной файловой системы, а это значит, что нам не удастся создать жесткую ссылку в домашнем каталоге на файл с флешки или сетевого диска. А как же быть, если требуется работать с файлом, а каждый раз вводить полный путь к нему неудобно – для этого существуют символьный ссылки, это полный аналог ярлыков в Windows (даже стрелочки такие же). Создадим символьную ссылку, но для этого надо «восстановить» удаленный файл file: serg@serg:~/work$ ln file.hardlink file Что мы видим - i-node у файлов file и file.simlink разные (479934 и 479940) а значит - это разные файлы. Символьная ссылка – это отдельный файл, содержащий информацию о файле, на который он ссылается — при просмотре содержимого символьной ссылки file.simlink мы видим текст sometext, который содержится в исходном файле file. О том, что файл, является символьной ссылкой, говорит значок "->". Символьная ссылка лишена ограничений, присущих жестким ссылкам – её можно создать на файл, находящийся где угодно. А в чем же отличие, спросите вы, а отличие в том, что символьная ссылка, с исходным файлом никак не связана — это отдельный файл, указывающий на файл исходный. Удалим исходный файл: serg@serg:~/work$ rm file
Примечание: символические ссылки нельзя переносить в другие каталоги - они перестают работать. КаталогиТеперь на очереди каталоги – что же это такое? В среде Windows нам прививали понятия документ - папка, т.е. файл это документ, а каталог (папка) это вместилище файлов. Сейчас остановитесь и подумайте, а в линуксе так может быть? - нет, нет и еще раз нет, а потому что файлы не «хранятся» в папках – иначе КАК один и тот же файл может ОДНОВРЕМЕННО присутствовать в разных местах (если не поняли о чем я, то еще раз перечитываем про жесткие ссылки). Итак, каталог в линуксе это…файл, только этот файл содежит описания файлов, которые в нем находятся. Поэтому аналог понятия папки, как в Windows, здесь в корне не верен, каталог – это скорее библиотечный ящичек с карточками на различные книги, а сами книги (т.е. файлы) хранятся на полках библиотеки, а карточки на одну и ту же книгу могут одновременно лежать в разных ящичках. Чтобы лично убедиться в этом - создадим каталог и переместим в него одну из жестких ссылок на наш файл: serg@serg:~/work$ mkdir directory Что мы видим — файлы с ОДИНАКОВЫМ 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 Наш рабочий файл (file.hardlink) мы удалили вместе с каталогом (такое иногда бывает), в котором он лежал Типы файловИ наконец рассмотрим основные типы файлов на фагменте вывода команды ls -l из предыдущего примера: 479944 drwxr-xr-x 2 serg serg 4096 2009-05-06 21:44 directory Первый символ в строке прав доступа и означает тип файла: |


