Создание ссылок и удаление файлов |
![]() |
Добавил(а) microsin |
В этой статье рассмотрены жесткие (hardlinks) и символьные или символические (softlinks) ссылки, а также разобрано удаление файлов и директорий с помощью команд rm и rmdir. Авторы: Daniel Robbins, Chris Houser, Aron Griffis. Взято на Хабре тут: http://habrahabr.ru/blogs/linux/99653/. [Жесткие ссылки (hard links)]
Мы уже упоминали термин «ссылка», когда рассказывали о взаимоотношениях
между директориями (их именами) и инодами (индексным номерами, лежащими в
основе файловой системы, которых мы не замечаем). Вообще в Linux
существует два типа ссылок. Тип, о котором мы уже говорили ранее,
называется «жесткие ссылки». Каждый инод может иметь произвольное число
жестких ссылок. Когда уничтожается последняя жесткая ссылка, и не одна
программа не держит файл открытым, то Linux автоматически удаляет его.
Новые жесткие ссылки можно создать воспользовавшись командой ln: 15782 firstlink 15782 secondlink Как видите, жесткие ссылки работают на уровне инодов, для указания конкретного файла. В Linux системах, для жестких ссылок есть несколько ограничений. В частности, можно создавать жесткие ссылки только на файлы, не на директории. Да-да, именно так; хотя "." и ".." являются созданными системой жесткими ссылками на директории, вам (даже от имени пользователя «root») не разрешается создавать любые свои собственные. Второе ограничение жестких ссылок состоит в том, что нельзя связать ими несколько файловых систем. Это значит, что у вас не получится создать жесткую ссылку с /usr/bin/bash на /bin/bash и если ваши директории / и /usr находятся в разных файловых системах (разделах — прим. пер.). [Символьные ссылки (soft links)] В практике, символьные ссылки (или символические, иногда «симлинки» — от англ.) используются гораздо чаще, чем жесткие. Симлинки — это файлы особого типа, которые ссылаются на другие файлы по имени, а не прямо по номеру инода. Они не спасают файлы от удаления; если файл, на который указывает ссылка, исчезает, то симлинк перестает работать, ломается.
Символические ссылки можно создать передав для ln опцию -s. -rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 firstlink -rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 secondlink lrwxrwxrwx 1 agriffis agriffis 10 Dec 31 19:39 thirdlink -> secondlink В выводе ls -l символьные ссылки можно отличить тремя способами. Во-первых, обратите внимание на символ l в первой колонке. Во-вторых, размер символической ссылки равен количеству символов в ней (secondlink в нашем случае). В-третьих, последняя колонка в выводе показывает куда ведет ссылка с помощью интуитивного обозначения "->". [Симлинки детально] Символические ссылки в целом более гибкие, чем жесткие. Вы можете создавать символьные ссылки на любой объект файловой системы, включая директории. И благодаря тому, что их реализация основана на путях (не инодах), можно совершенно свободно создать символьную ссылку указывающую на объект другой файловой системы. Однако, сей факт также делает их сложными в понимании.
Предположим, что мы хотим создать ссылку в /tmp, которая указывает на /usr/local/bin. Нам следует набрать: lrwxrwxrwx 1 root root 14 Jan 1 15:42 bin1 -> /usr/local/bin Либо, альтернативный вариант:
lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin Как вы видите, обе символические ссылки указывают на одну директорию. Однако, если наша вторая символьная ссылка когда-нибудь будет перемещена в другую директорию, то она может «поломаться» из-за относительности пути:
lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin
$ mkdir mynewdir
Потому, что директории /tmp/usr/local/bin не существует, мы больше не можем переместиться в bin2; другими словами, bin2 сейчас сломана. -rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain От имени суперпользователя мы хотим короткий синоним для keychain, такой, как kc. В этом примере у нас есть root-доступ, о чем свидетельствует измененное на "#" приветствие bash. Нам нужен root-доступ потому, что обычные пользователи не имеют прав создавать файлы в /usr/bin. От имени суперпользователя мы можем создать альтернативное имя для keychain следующим образом:
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain # ls -l kc lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain В этом примере мы создали символьную ссылку под названием kc, которая указывает на файл /usr/bin/keychain. Пока это решение будет работать, но создаст проблему, если мы решим переместить оба файла, /usr/bin/keychain и /usr/bin/kc в /usr/local/bin:
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain # ls -l /usr/local/bin/kc lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain Поскольку мы использовали абсолютный путь для символической ссылки kc, то она все еще ссылается на /usr/bin/keychain, которого не существует с тех пор как мы переместили /usr/bin/keychain в /usr/local/bin.
Это привело к тому, что симлинк kc сейчас не работает. Как
относительные, так и абсолютные пути в символьных ссылках имеют свои
достоинства, и, в зависимости от вашей задачи, нужно использовать
соответствующий тип пути. Часто, и относительный, и абсолютный путь,
будут работать одинаково хорошо. Пример ниже будет работать, даже после
перемещения обоих файлов: lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc -> keychain # mv keychain kc /usr/local/bin # ls -l /usr/local/bin/keychain -rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain # ls -l /usr/local/bin/kc lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> keychain Теперь, мы можем запустить программу keychain набрав /usr/local/bin/kc. /usr/local/bin/kc указывает на программу keychain в той же директории, где находится kc. [rm]
Итак, мы знаем как использовать cp, mv и ln, настало время узнать о том,
как можно удалять объекты из файловой системы. Обычно это делается с
помощью команды rm. Чтобы удалить файлы, просто укажите их в командной
строке: -rw-r--r-- 1 root root 0 Jan 1 16:41 file1 -rw-r--r-- 1 root root 0 Jan 1 16:41 file2
Для удаления директорий у вас имеется два варианта. Вы можете удалить
все объекты внутри директории и затем воспользоваться rmdir для удаления
самой директории: |