Лекция №7 - регулярные файлы и линки.

Регулярные файлы - это объекты файловой системы, которые содержат данные. Другими словами это обычные файлы с которыми вы привыкли имеет дело: текстовые файлы, музыкальные композиции, рисунки, видео-файлы - все это регулярные файлы. Просмотреть содержимое таких файлов можно командами cat, less. Создать файл можно несколькими способами.Первый способ - это с помощью команды touch. На самом деле основное назначение этой команды это изменять время доступа и изменения файла. Выполните команду ls -l в вашем домашнем каталоге. В шестом столбце указаны даты последнего изменения файлов. Выберите файл с датой отличной от текущей и выполните команду touch имя вашего файла (возможно нужно будет выполнить команду от пользователя root). Теперь снова ls -l и увидите, что дата изменилась на текущую. У команды touch есть небольшое “побочное” действие. Если ей в качестве параметра передать имя несуществующего файла, то она все равно выполнит, то что от нее просят (изменит время), а так как файла нет, то она его создаст. Выполните команду touch с именем несуществующего файла и по команде ls убедитесь, что он есть. Файл будет создан пустым. Редактировать такой файл можно любым текстовым редактором (vim, nano). Еще один способ это передать какой-либо текст в файл следующим образом echo Hello world! >  test.txt. В результате выполнения этой команды будет создан файл с именем test.txt с содержимым Hello world! Таким образом в файл можно перенаправить результат выполнения любой команды. Например, команда  ls > list.txt создаст файл list.txt в котором будет содержаться перечень содержания текущего каталога. Еще один способ - это при помощи любого текстового редактора.

Правила именования файлов. Первое, что необходимо четко уяснить и запомнить: Linux (в отличии от Windows) в именах файлов учитывает регистр букв. То есть Test, test, tEst, TEST - это все будут разные файлы. Вторая отличительная (от Windows) особенность, это расширение файла. В Linux его просто нет. Точка в имени файла это такой же символ как и другие. Создавая командой touch файлы с именами test.txt, test.doc или test.jpg мы все равно создадим текстовый файл. Расширения больше нужны для кроссплатформенных приложений, чтобы те находили “свои” файлы.

Очень важным является вопрос какие символы можно использовать для имен файлов, а какие нельзя. Этому вопросу можно было бы уделить пол-лекции, так как существует довольно много вариантов когда те или иные символы можно или нельзя использовать. Я предлагаю запомнить следующее: в именах файлов всегда можно использовать следующие символы: цифры, буквы (лучше латиницу), точка, знак подчеркивания. Набора этих символов вполне достаточно, чтобы называть ваши файлы. Поэтому я намеренно не буду указывать какие символы использовать нельзя. Просто помните какие можно и используйте их. Любопытные могут найти дополнительную информацию в Интернете. Длина имени файла 255 байт.

Для того чтобы переименовать или перенести файл существует команда mv (сокращенно от move). Вот несколько примеров использования этой команды:

mv test.txt text.tst - переименование файла test.txt в text.tst в текущем каталоге.
mv /home/igor/docs/test /home/igor/docs/text - переименование файла test в каталоге /home/igor/docs/
mv test1.txt ./docs/ - перенести файл test1.txt в каталог /docs/

Для копирования файлов используется команда cp (сокращенно от copy). Форма ее схож с командой mv. Несколько примеров.

cp test ./docs/ - копируем файл test в каталог ./docs
cp ./docs/test1.txt . - копирование файла test1.txt в текущий каталог (обратите внимание на точку в конце команды).

Пришло время объяснить, что обозначает точка в приведенных примерах. Если вы для любого каталога выполните команду ls -a (ключ а позволяет отобразить скрытые файлы), то всегда вверху увидите два символа: . - точка и .. - две подряд идущие точки. Это тоже названия каталогов. Точка обозначает текущий каталог, а две точки обозначает родительский каталог. Вы можете выполнить команду ls .. и посмотреть список файлов родительского каталога для текущего. Для перемещения по каталогам используется команда cd. Набрав команду cd /boot/grub/ вы переместитесь в каталог grub, который находятся в каталоге boot. По команде cd .. , вы перейдете родительский для каталог для текущего, то-есть в boot. Таким образом можно по команде cd .. перемещаться вверх по дереву файловой системы. Чтобы перейти в свой домашний каталог нужно набрать команду cd ~ (”тильда” - означает домашний каталог). Перейдите теперь в каталог /usr (cd /usr/). Выполните команду ls. В каталоге среди прочих присутствует каталог /bin. Как посмотреть его содержимое? Набрав, ls /bin - вы отобразите содержимое каталога /bin, который находится в корне операционной системы. Нужно либо указать полный путь: ls /usr/bin/ или написать следующим образом ls ./bin/ . Если бы не было этих спец-имен, то команду cp ./docs/test1.txt . пришлось бы писать следующим образом: cp /home/igor/docs/test1.txt /home/igor/ .

Удаление файлов. Здесь нужно быть предельно внимательным и приучить себя к мысли, что никаких “корзин” в Linux нет и удаляя файл, вы удаляете его навсегда. Поэтому прежде чем, что-то удалять подумайте не один, а два раза, а то и три. Для удаления файлов существует команда rm. Команда универсальная в том смысле, что позволяет удалять все типы файлов. Формат простой: rm [ключи] имя файла. Самый важный ключ этой команды это -i. С этим ключом команда спросит вас действительно ли вы хотите выполнить удаление. Без этого ключа команда удалит файл без вопросов. Создайте несколько файлов и попробуйте их удалить с ключом i и без него. Если в вашем дистрибутиве команда rm без ключей выдает запрос, значит используется механизм алиасов. Если вы не хотите получать запрос на удаление, то команду rm необходимо выполнить с ключом -f. Но об этом позже. Чтобы удалить директорию необходимо команду rm использовать с ключом -r. Также для удаления директории существует команда rmdir.

Теперь давайте рассмотрим как операции удаления, копирования и перемещения можно выполнять для группы файлов. Для этого необходимо использовать символы групповых операций. Создайте у себя в домашнем каталоге, подкаталог temp (cd ~; mkdir temp), перейдите в него (cd ~/temp/) и создайте несколько файлов: touch file1.txt file2.txt file3.txt; touch file1.jpg file2.jpg file3.jpg; touch abcd asdf azxs adcd .

Теперь подробнее о символах групповых операций. Символ * - обозначает любое количество любых символов. Для проверки будем использовать команду ls с соответствующими символами.

ls *.jpg - в результате будут отображены все файлы которые заканчиваются на .jpg . Результат: file1.jpg  file2.jpg  file3.jpg .

ls file* -  будут отображены все файлы, которые начинаются на file. Результат: file1.jpg  file1.txt  file2.jpg  file2.txt  file3.jpg  file3.txt .

Символ ? - заменяет любой один символ.

ls a?cd - результатом будут все файлы состоящие из 4-х символов, первый - a, третий, четвертый - cd, а второй может быть любым. Результат: abcd  adcd .

[] - в квадратных скобках можно задавать определенные символы или диапазон символов.

ls [abcd][abcd]* - результатом будут все файлы первый и второй символ которых a, b, c или d. Результат: abcd  adcd.

ls *[23]* - результатом будут все файлы в которых есть цифра 2 или 3. Результат: file2.jpg  file2.txt  file3.jpg  file3.txt .

ls file[1-3]* - результатом будут все файлы начинающиеся на file у которых далее идет цифра из диапазона 1-3. Результат: file1.jpg  file1.txt  file2.jpg  file2.txt  file3.jpg  file3.txt .

Я не случайно показал работу с символами групповых операций на примере команды ls. Рекомендую на начальном этапе изучения Linux при использовании групповых операций (или шаблонов) для команды rm использовать команду ls для проверки того, что вы будете удалять. Создайте в нашем каталоге ./temp/ еще несколько файлов touch file1txt file2txt file3txt file4txt file5txt . Теперь допустим вы хотите удалить созданные только, что файлы. Для этого можно воспользоваться командой rm file[1-5]*txt . Но эта команда удалит не только файлы file1txt file2txt file3txt file4txt file5txt , но и файлы file1.txt  file2.txt  file3.txt ! А это нам совсем не нужно. Выполнив команду ls file[1-5]*txt вы увидите, что данный шаблон затрагивает и нужные файлы. И команду нужно выполнить как rm file[1-5]txt . Не ленитесь проверять ваши шаблоны, пока не будете чувствовать себя уверенно в их написании.

Линки (links)

Линки - это также особый тип файлов в Linux как каталоги или файлы-устройства. Есть два типа линков: симолические линки (symbolic link) и жесткие линки (hard link). Символический линк - это файл внутри которого содержится путь к объекту файловой системы. Создается символический линк при помощи команды ln с ключом -s .

ln -s путь к объекту имя линка

Перейдите в домашний каталог (cd ~) и выполните команду mkdir -p ./object/folder1/folder2/folder3 . Команда mkdir с ключом -p позволяет создать несколько вложенных каталогов. Создайте файл touch ./object/folder1/folder2/folder3/myfile . А теперь создайте символический линк на созданный файл:

1
ln -s ./object/folder1/folder2/folder3/myfile mylink

Выполните команду ls -l и найдите созданный символический линк - mylink. Вы должны увидеть что-то вроде:

1
lrwxrwxrwx 1 igor igor  39 2009-10-06 17:24 mylink > ./object/folder1/folder2/folder3/myfile

Символ l (самый первый в первом столбце), говорит о том, что тип файла - link. А также мы можем видеть на какой объект ссылается линк. Число 39 говорит о размере файла mylink. Если вы посчитаете количество символов в пути к объекту, то из будет 39. То есть в нашем файле действительно не содержится ничего кроме ссылки на myfile. Если вы выполните команду cat mylink, то ничего не увидите, так как откроете для просмотра не файл mylink, а файл myfile на который ссылается линк. Чтобы отредактировать файл myfile можно выполнить команду nano ./object/folder1/folder2/folder3/myfile, а можно nano mylink - в результате откроется один и тот же файл. Если удалить файл myfile, то линк никуда не исчезнет, но при попытке выполнить команду cat mylink вы получите сообщение, что файла не существует. Если вы снова создадите в месте куда ссылается линк файл myfile, то снова можно будет получить к нему доступ используя символический линк. Если удалить символический линк указывающий на файл, то с самим файлом ничего не случится - он останется на месте. Создавать линки можно не только на файлы, но и на каталоги. Например:

1
ln -s ./object/folder1/folder2/folder3/ mydirlink

Выполнив команду cd ./mydirlink/ мы попадем в каталог ./object/folder1/folder2/folder3/.

Теперь несколько особенностей по работе с символическими ссылками. Создавая символические ссылки старайтесь указывать к файлу полный путь (без точки как в примерах выше). Если вы переместите линк в котором будет относительный путь в другую папку, то он перестанет работать. Думаю причины вам понятны. Теперь об операциях перемещения и копирования символический линков. Предлагаю вам самостоятельно рассмотреть особенности работы команд cp и mv с символическими линками. Попробуйте покопировать и поперемещеать линки на файлы и каталоги и посмотреть на результаты.

Чтобы понять, что такое жесткие линки, нужно немного понимать как устроена файловая система. Попробую объяснить максимально просто и наглядно, а вы уже самостоятельно при желании сможете изучить детали. Пространство жесткого диска в файловой системе логически разбито на одинаковые блоки, которые называют кластерами. Файловая система имеет скрытую таблицу в которой содержится информация об объектах файловой системы (см. рис. 1).

inode

Рисунок 1

Информация в таблице содержится самая разнообразная, но нас будут интересовать два поля: имя объекта и inode. В данном контексте будем считать, что inode - это число которое однозначно идентифицирует файл в пространстве файловой системы (в том числе и расположение). Допустим у нас есть файл с именем file1. Ему соответствует inode1, который указывает где расположен файл на диске. Создайте у себя файл с именем file1. А теперь создадим жесткие линки на этот файл (в том же каталоге) с именами file4 и file5 и один символический линк с именем link1:

1
ln file1 file4; ln file1 file5; ln -s file1 link1

Теперь выполните команду ls -li, которая покажет вам имена файлов и их inode (первый столбец).

1
2
3
4
370923 -rw-r--r--           3 igor igor        27 2009-10-08 12:28 file1
370923 -rw-r--r--           3 igor igor        27 2009-10-08 12:28 file4
370923 -rw-r--r--           3 igor igor        27 2009-10-08 12:28 file5
293812 lrwxrwxrwx  1 igor igor              5 2009-10-08 13:02 link1 > file1

Смотрим на результат и видим, что у наших жестких ссылок file4 и file5, inode совпадает с inode файла file1. То есть получается, что file1, file4 и file5 - это физически один и тот же файл, но с разными именами, которые являются абсолютно равнозначными. На жестком диске они занимают одно и то же место (см. рисунок 1). Если вы выполните команду rm file1, то произойдет следующее: в таблице (см. рисунок 1) исчезнет запись относящаяся к file1. Но на диске данные на которые указывал inode file1 останутся, и мы сможем получить к ним доступ по именам file4 или file5. Цифра 3 в третьем столбце результатов команды ls -li указывает на то что для указанного inode существует три имени. Удалите file1 и убедитесь, что число уменьшилось на один и теперь равно 2.

В этих же результатах вы можете видеть, что link1 - это файл который занимает отдельное физическое место на диске и у него есть свой inode.

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

Жесткие линки не могут указывать на несуществующий объект. Символические линки - могут.

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

Поупражняйтесь в создании символических и жестких линков и придумайте в каких случаях их можно применить.

Читать другие лекции по курсу Администратор ПК с Linux

Статьи и новости схожей тематики:

Комментариев: 10

  1. Алексей:

    ln file1 file4; ln file1 file5; ln file1 link1
    ———————————————-

    ln file1 file4; ln file1 file5; ln -s file1 link1

    во, как-то так :)

    Ответить

    Igorka Reply:

    Алексей, большущее спасибо! Уже поправил.

    Ответить

  2. Алексей:

    ;-) спасибо за интересные статейки

    Ответить

  3. Igorka: Установка и привязка профиля qutim к Dropbox в Ubuntu:

    [...] решался очень просто - с использованием механизма символических ссылок. Ниже как раз и описана кратко установка и действия [...]

  4. Igorka: Временные параметры файла - atime mtime ctime:

    [...] chmod), изменяется владелец файла (команда chown), создаются жесткие ссылки на файл (команда ln). В этом плане различий с каталогом нет, с [...]

  5. Lesya:

    А если жесткие ссылки находятся не в одном каталоге, и с помощью команды ls мы видим, что жестких ссылок на файл, допустим 5, можно ли узнать их местонахождение?

    Ответить

    Igorka Reply:

    Можно.
    С помощью команды find. Если кратко, то вот пример:

    1
    2
    $ ls -li lnfile5
    659942 -rw-r--r-- 4 igor igor 0 2010-07-29 17:11 lnfile5

    Есть 4 ссылки. Ищем файлы по имени:

    1
    2
    3
    4
    5
    $ find -samefile lnfile5
    ./timetest/lnfile6
    ./timetest/lnfile5
    ./timetest/file4
    ./lnfile5

    или по номеру inode:

    1
    2
    3
    4
    5
    $ find -inum 659942
    ./timetest/lnfile6
    ./timetest/lnfile5
    ./timetest/file4
    ./lnfile5

    Только учитывайте особенности команды find (где и как по умолчанию она ищет файлы).

    Ответить

    Lesya Reply:

    Спасибо за статью и за быстрый ответ

    Ответить

  6. Garik:

    спосибо за статью

    Ответить

Оставьте свой отзыв