Андрей Смирнов
Время чтения: ~15 мин.
Просмотров: 5

Жёсткая ссылка

Как Создать Символическую Ссылку в Linux

Итак, давайте разберёмся, как создать символические ссылки на файлы и папки в Linux.

Символическая Ссылка Linux на Файлы

Обычно для создания ссылок мы используем команду ln и опцию -s, чтобы указать символическую ссылку. Это самый простой и гибкий способ, который позволяет максимально экспериментировать с языком. В создании символических ссылок в Linux нет ничего сложного — нужно просто выполнить один простой шаг.

ln -s  

Команда ln в Linux создает ссылки между исходными файлами и каталогами.

  • -s — команда для символических ссылок.
  • — имя существующего файла, для которого вы создаёте ссылку.
  • — эта часть команды объясняет сама себя.

Проверить создалась ли ссылка можно с помощью команды вывода подробного списка содержимого каталога:

ls -l

Однако, если вы не укажете , команда автоматически создаст новую ссылку в существующем каталоге.

Символическая Ссылка Linux на Папки

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

ln -s [конкретный_файл/каталог]  

Допустим, мы хотим связать каталог /user/local/downloads/logo с каталогом /devisers, вот как будет выглядеть команда:

ln -s /user/local/downloads/logo /devisers

Созданная и прикреплённая к папке /devisers, символическая ссылка будет вести к /user/local/downloads/logo. Когда пользователь меняет каталог — cd — на /devisers, система автоматически переключается на определённый файл и записывает его в каталог команды.

Опции символических ссылок называются переключателями командной строки. Вот наиболее распространённые из них и их описания:

Переключатель Описание
–backup резервное копирование каждого существующего файла назначения
-d, -F, –directory суперпользователь может использовать жесткую ссылку
-f, –force удаляет существующий файл назначения
-I, –interactive спрашивает перед удалением файлов назначения
-L, –logical разыменовывает символические ссылки
-n, –non-dereference обрабатывает символическую ссылку как обычный файл, если это символическая ссылка на каталог
-P, –physical делает жесткие ссылки непосредственно на символические ссылки, а не разыменовывает их.
-r, –relative создаёт символические ссылки относительно расположения ссылок
-s, –symbol создаёт символические ссылки вместо жестких ссылок
-S, –suffix=SUFFIX переопределяет обычный суффикс резервных копий
-v, –verbose выводит имя каждого файла при создании ссылки

Как Изменить или Удалить Символическую Ссылку в Linux?

Вы можете удалить существующие ссылки, прикреплённые к файлам или каталогам, с помощью команды unlink или rm. Вот как вы можете сделать это с помощью команды unlink:

unlink 

Аналогичным образом удаляем символическую ссылку с помощью команды rm:

rm 

Например:

rm simpleText

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

Mklink examples

Note

The mklink command requires you to be in an elevated command prompt.

mklink /d \Docs \Users\Hope\Documents

The example command above would create a symbolic link called Docs to the \Users\Hope\Documents directory, even if the directory does not exist. If the link is successfully created, you will see a message similar to the one shown below.

Symbolic link created for \Docs <<===>> \Users\Hope\Documents

Once the symbolic link is created, using the dir command you can see any symbolic link in the directory listing of where it was created. Below is an example of what the previous symbolic link directory, <SYMLINKD>, would look like in the command line.

To get into the symbolic link directory, you would treat it like any other directory and use the cd command. To get into the Docs directory, you would type «cd docs» at the prompt as if it was a directory.

How do I create a junction point?

Note

A junction point can only link to a local directory.

To create a junction point to a local directory, perform the following command. As seen, we are using the /j switch instead of the /d switch.

mklink /j example backup

If created successfully, you will see a message similar to the example shown below.

Junction created for example <<===>> backup

Once the junction is created, using the dir command you can see any junction in the directory listing of where the junction was created. Below is an example of what the above junction directory <JUNCTION> would look like in the command line.

How do I create a symbolic link or junction to a directory with a space?

If the file or directory you want to link or point to contains a space in its name, it must be surrounded with quotes. In the example below, we are creating a symbolic link to the «c:\program files» directory from the current directory.

mklink /d files "c:\program files"

How do I delete a symbolic link?

To delete a symbolic link, treat it like any other directory or file. If you created a symbolic link using the command shown above, move to the root directory since it is «\Docs» and use the rmdir command. If you created a symbolic link (<SYMLINK>) of a file, to delete a symbolic link use the del command.

Will deleting a symbolic link or junction point delete the linked files or directory?

No. When you delete a symbolic link or a junction point, it’s only removing the link or pointer and not the file or directory to which it’s pointing. However, if you create a directory symbolic link or junction point and open that link or pointer and delete files in the directory, those files are deleted.

Solution

So my first step was to troubleshoot the issue and try to isolate the problem. It effectively came down to a number of things.

Firstly (issue 1) I was packaging the plug-in on a Windows 7 build system. When the contents were synced from the Perforce depot our symlinks were automatically lost. This is as expected as Windows doesn’t have a notion of symlinks so instead creates files in their place. So the workaround was to build the plug-in on a symlink supported platform such as Mac OSX. The plug-in was part of a feature which consisted of a number of plug-ins. Therefore instead of moving all the build process to a Mac build system I opted to create a Master — Slave setup which is available on Hudson.  This was really easy. The documentation is a bit limited but the comments on the page are quite helpful. I kept the Window’s machine as a Master and added the Mac build system as a Slave. With this change I was guaranteed that the symlinks would be intact when synced from Perforce.  For the slave options I chose the SSH launch method and used the label ‘mac’ as an identifier for assigning jobs that should only run on the slave.

However this did not solve the problem…I then discovered that Eclipse does not support symlinks. A designated Eclipse workspace was referred to as part of the build process which contained all the eclipse plug-in projects that needed to be compiled. The Mac bundle was included in a particular plug-in project as a resource. So when the bundle was added to the project as a resource within the Eclipse workspace, the symlinks, once again were lost.

I therefore thought of a solution to remove the bundle from the plug-in but then copy the contents after the compilation process.  I was using Ant to complete the compilation, testing and packaging processes. So naturally you would think of using Ant’s Copy Task.  DON’T; Ant doesn’t support symlinks so you need to use the exec task.  When using the exec task you can either add the commands directly within Ant or point to a shell script:<exec executable=“/bin/sh” failonerror=“true”>               <arg value=“copylibs.sh” />               <arg value=“arg1” />               <arg value=“arg2” /></exec>shellscript: cp -RP $1 $2/libs<exec executable=“cp” >       <arg line=’-RP “source”’ />       <arg line=“destination” />      </exec> So the bundle is copied after the compilation to the compiled plug-in and the symlinks remain intact.  The next step was to package the .jar for the plug-in.  Can you see a pattern?  So jar is a Java archive facility and as Java does not support symlinks and neither does Ant, the use of the jar Ant task was unavailable.  When you attempted the following command the symlinks were once again lost:<jar manifest=“${output.dir}/META-INF/MANIFEST.MF” basedir=“${output.dir}/”               includes=“*/**”               excludes=“src/”               destfile=“${output.dir}/archive/${name}_${version}.${TODAY}.jar”>

</jar> The final workaround was to exclude the Mac bundle and generate the plug-in .jar and then update the .jar to include the Mac Bundle.  So firstly I created the jar file with all the contents (excluding the Mac bundle) and then executed the shell script passing details of the libs directory, the output directory and the newly created jar file:

Копирование файлов с жёсткими ссылками

При простом копировании файлов жёсткие ссылки разыменовываются, т.е. каждая ссылка превращается в самостоятельный файл. Для преодоления этого ограничения в UNIX-подобных системах используется конвейер из команд find и cpio:

(в каталоге-источнике)

find -depth -print0 | cpio -p -v -d --null <каталог назначения>

(Ключ -depth заставляет find выводить имена каталогов после их содержимого, благодаря чему команда cpio сможет последовательно воссоздать дерево файлов. Ключ -print0 сохраняет пробелы в именах файлов, меняя разделитель строк на символ NULL (код 0x0). Ключи cpio: -p — режим конвейера, -d — создание каталогов, -v — отображение хода работы, —null — указывает на то, что разделителем строк выступает нулевой символ.)

Жесткая ссылка – не копия!

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

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

На практике это имеет следующие последствия. При внесении изменений в файл, обращение к которому было под одним именем, эти изменения обнаружатся и тогда, когда обращение к файлу произойдет под другим именем. При создании копии файла и последующем изменении данных этой копии, данные первоначального файла, с которого «снималась» копия, не изменятся.

В случае мягких ссылок, хоть и создается новый файл (с собственным индексным дескриптором), но он не содержит данных файла-оригинала, а лишь содержит запись адреса другого файла. Символьная ссылка – особый тип файла Linux.

Top mklink Askers

All Time

38

Samuel Rossille

15.7k1616 gold badges5353 silver badges8282 bronze badges

13

praskris

44955 silver badges1313 bronze badges

13

Jan Prokes

16311 gold badge22 silver badges55 bronze badges

11

Sam

1,66522 gold badges1717 silver badges3232 bronze badges

8

seaders

3,00633 gold badges2929 silver badges5555 bronze badges

7

user3120554

36311 gold badge66 silver badges1717 bronze badges

6

Felix Dombek

10.7k1515 gold badges6363 silver badges109109 bronze badges

4

Blueberry

2,01922 gold badges1515 silver badges2828 bronze badges

3

tmighty

7,3381616 gold badges6969 silver badges158158 bronze badges

3

ChrisM

93066 silver badges1818 bronze badges

3

9a3eedi

68311 gold badge66 silver badges1616 bronze badges

3

Jaroslav Gorjatsev

5911 silver badge66 bronze badges

3

Vinz243

6,96688 gold badges3434 silver badges7171 bronze badges

3

ide

8722 silver badges1111 bronze badges

3

кคгtђเςк ĞŔĶ

18333 silver badges1414 bronze badges

3

MäxL

19511 gold badge11 silver badge66 bronze badges

2

HamOp_N8MDP

2111 bronze badge

2

sancho.s ReinstateMonicaCellio

10.5k1212 gold badges4949 silver badges121121 bronze badges

2

Sathish Kumar

98044 gold badges1515 silver badges2929 bronze badges

2

wookiee

11022 silver badges1111 bronze badges

Only non community-wiki questions and answers are included in these totals (updated daily)

Индексный дескриптор

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

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

Именно номер индекса является истинным именем файла в системе. Мы можем их увидеть с помощью ключа -i команды ls.

Создание символических ссылок в Linux

В статье показано как создать символическую ссылку в Linux.

Синтаксис

ln исходный_файл

ln исходный_файл … целевой_каталог

link исходный_файл целевой_файл

Описание

Программа ln создает запись в директории ( ссылку ) с именем, целевой_файл.

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

Каким образом ссылка указывает на исходный_файл, зависит от типа данной ссылки.

Команда ln имеет следующие опции:

-f Если целевой_файл уже существует, удалить его , чтобы можно было создать ссылку.
Данная опция отменяет опцию -i.

-F Если целевой_файл уже существует и является директорией, удалить его, чтобы можно было создать ссылку. Опция -F используется вместе с опциями -f или -i, в случае, если ни одна из них не указана, подразумевается опция -f.

Эта опция не работает без опции -s.

-h Если целевой_файл или целевой_каталог является символической ссылкой, не следовать по ей. Данная опция полезна в сочетании с опцией -f для замены символической ссылки, которая
указывает на каталог.

-i Интерактивный режим. Если целевой_файл существует, пользователю будет выведен запрос на удаление В случае согласия, ln удалит целевой_файл и создаст новую ссылку. Данная опция отменяет действие опции -f.

-n Аналог опции -h, для совместимости с другими реализациями программы ln.

-s Создавать символическую ссылку.

-v Режим вывода информации о ходе выполнения программы ln.

По-умолчанию, программа ln создаёт жёсткие ссылки. Жесткая ссылка на файл, ничем не
отличается от исходного файла; при этом, изменения сделанные в файле, не зависят от имени,
по которому к нему было сделано обращение.

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

Символическая ссылка содержит имя файла, на который ссылается. При выполнении операции
open(2) над символической ссылкой используется оригинальный файл. Вызов stat(2), выполненный
над символической ссылкой, также вернёт исходный файл. Для получения информации о ссылке
можно использовать lstat(2). Для чтения содержимого символической ссылки можно
воспользоваться вызовом readlink(2). В отличии от жестких ссылок, символические,
могут находиться в другой файловой системе и могут указывать на каталоги.

С одним или двумя аргументами, программа ln создаёт ссылку на существующий исходный_файл. Имя для ссылки будет взято из аргумента целевой_файл. Если в аргументе целевой_файл, не указана директория, для создания ссылки, будет использована текущая директория, если указан только каталог, будет создана ссылка на последний элемент из исходный_файл.

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

Если программа ln, вызывается в форме link, ей передается ровно два аргумента, передаваемые аргументы не могут быть каталогами, кроме того, в данной форме она не принимает никаких опций. Это простая форма использования.

Совместимость

Опции -h, -i, -n и -v, предназначены для совместимости с другими реализациями программы ln, и не рекомендуются для использование в скриптах.

Примеры

Вот пример создания ссылки на файл

ln  

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

Но ведь нас интересуют и каталоги. А с ними все немного сложнее, но не бойтесь. Вся сложность только в дополнительном параметре команды nl. Этот параметр -s. Вот пример создания символической ссылки на каталог в linux

После этого, каталог /raid/scripts/checker будет доступен и по этому адресу /raid/www_tools/checker.

Такие ссылки можно создавать и в категории вашего веб каталога и обращаться к файлам или каталогам по ссылкам через HTTP.

Top mklink Answerers

All Time

49

Christophe Geers

7,19733 gold badges2929 silver badges4444 bronze badges

10

P. T.

12111 silver badge33 bronze badges

8

Matthias

8711 silver badge33 bronze badges

7

AndriuZ

56355 silver badges1919 bronze badges

7

Christopher King

82611 gold badge66 silver badges1313 bronze badges

6

Matt Bierner

28.4k66 gold badges8181 silver badges121121 bronze badges

6

user1937198

3,89522 gold badges1616 silver badges3030 bronze badges

5

Jonathan Potter

32.7k44 gold badges4949 silver badges6565 bronze badges

5

VonC

972k397397 gold badges33423342 silver badges39113911 bronze badges

5

Keith Hill

165k3232 gold badges300300 silver badges339339 bronze badges

4

James

5611 bronze badge

3

Random_Automation

38122 silver badges88 bronze badges

3

Harry Johnston

32.5k66 gold badges4949 silver badges132132 bronze badges

3

Ben Personick

2,11211 gold badge1414 silver badges1818 bronze badges

3

Michael

22122 silver badges99 bronze badges

3

Prasoon Srivastava

27433 silver badges1010 bronze badges

3

QAT

5355 bronze badges

3

Mark Kreitler

4622 bronze badges

3

Pybe

13211 bronze badge

3

Toby Meyer

31611 silver badge66 bronze badges

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации