- Символические и жесткие ссылки Linux
- Символические ссылки
- Жесткие ссылки
- Использование ссылок в Linux
- Создание символических ссылок
- Создание жестких ссылок
- Выводы
- How to List All Symlinks in the Linux Directory
- List All Symbolic Links Using the Find Command
- Syntax
- Examples
- List All Symlinks From the Entire Filesystem
- List All Symlinks in the Current Working Directory
- List All Symlinks in Any Directory
- List All Symlinks in a Directory Using Maxdepth Flag
- Conclusion
- About the author
- Shehroz Azam
- How do I find all of the symlinks in a directory tree?
- 8 Answers 8
- How to find and list all the symbolic links created for a particular file?
- Example:
- 4 Answers 4
Символические и жесткие ссылки Linux
Символические и жесткие ссылки — это особенность файловой системы Linux, которая позволяет размещать один и тот же файл в нескольких директориях. Это очень похоже на ярлыки в Windows, так как файл на самом деле остается там же где и был, но вы можете на него сослаться из любого другого места.
В Linux существует два типа ссылок на файлы. Это символические и жесткие ссылки Linux. Они очень сильно отличаются и каждый тип имеет очень важное значение. В этой небольшой статье мы рассмотрим чем же отличаются эти ссылки, зачем они нужны, а также как создавать ссылки на файлы в Linux.
Символические ссылки
Символические ссылки более всего похожи на обычные ярлыки. Они содержат адрес нужного файла в вашей файловой системе. Когда вы пытаетесь открыть такую ссылку, то открывается целевой файл или папка. Главное ее отличие от жестких ссылок в том, что при удалении целевого файла ссылка останется, но она будет указывать в никуда, поскольку файла на самом деле больше нет.
Вот основные особенности символических ссылок:
- Могут ссылаться на файлы и каталоги;
- После удаления, перемещения или переименования файла становятся недействительными;
- Права доступа и номер inode отличаются от исходного файла;
- При изменении прав доступа для исходного файла, права на ссылку останутся неизменными;
- Можно ссылаться на другие разделы диска;
- Содержат только имя файла, а не его содержимое.
Теперь давайте рассмотрим жесткие ссылки.
Жесткие ссылки
Этот тип ссылок реализован на более низком уровне файловой системы. Файл размещен только в определенном месте жесткого диска. Но на это место могут ссылаться несколько ссылок из файловой системы. Каждая из ссылок — это отдельный файл, но ведут они к одному участку жесткого диска. Файл можно перемещать между каталогами, и все ссылки останутся рабочими, поскольку для них неважно имя. Рассмотрим особенности:
- Работают только в пределах одной файловой системы;
- Нельзя ссылаться на каталоги;
- Имеют ту же информацию inode и набор разрешений что и у исходного файла;
- Разрешения на ссылку изменяться при изменении разрешений файла;
- Можно перемещать и переименовывать и даже удалять файл без вреда ссылке.
Использование ссылок в Linux
Теоретические отличия вы знаете, но осталось закрепить все это на практике, поэтому давайте приведем несколько примеров работы со ссылками в Linux. Для создания символических ссылок существует утилита ln. Ее синтаксис очень прост:
$ ln опции файл_источник файл_ссылки
- -d — разрешить создавать жесткие ссылки для директорий суперпользователю;
- -f — удалять существующие ссылки;
- -i — спрашивать нужно ли удалять существующие ссылки;
- -P — создать жесткую ссылку;
- -r — создать символическую ссылку с относительным путем к файлу;
- -s — создать символическую ссылку.
Создание символических ссылок
Сначала создайте папку test и перейдите в нее:
Затем создайте файл с именем source с каким-либо текстом:
echo «текст текст текст текст» > source
$ cat source
Файл готов, дальше создадим символическую ссылку Linux, для этого используется команда ln с опцией -s:
Попробуем посмотреть содержимое файла по ссылке:
Как видите, нет никакой разницы между ней и исходным файлом. Но утилита ls покажет что это действительно ссылка:
Несмотря на то, что содержимое одинаковое, здесь мы видим, что адрес иноды и права доступа к файлам отличаются, кроме того, явно показано что это символическая ссылка Linux.
Теперь удалите исходный файл и посмотрите что будет:
Вы получите ошибку, что такого файла не существует, потому что мы действительно удалили исходный файл. Если вы удалите ссылку, то исходный файл останется на месте.
Создание жестких ссылок
Снова создайте файл source с произвольным текстом:
echo «текст текст текст текст» > source
$ cat source
Теперь создадим жесткую ссылку Linux. Для этого достаточно вызвать утилиту без параметров:
Посмотрите содержимое файла:
Данные те же самые, а если мы посмотрим вывод утилиты ls, то увидим что inode и права доступа тоже совпадают:
Если для одного из файлов поменять разрешения, то они изменяться и у другого. Теперь удалите исходный файл:
Затем посмотрите содержимое:
Как видите, ничего не произошло и ссылка по-прежнему указывает на нужный участок диска, это главное отличие жесткой ссылки от символической. Мы можем сделать вывод, что жесткая ссылка linux это обычный файл. Каждый файл имеет как минимум одну ссылку, но для некоторых мы можем создать несколько ссылок.
Выводы
Это все, что вам было необходимо знать про символические и жесткие ссылки linux. Надеюсь, вы получили общее представление об этих возможностях файловой системы и сможете использовать их для решения своих задач.
На завершение видео про ссылки в Linux:
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
How to List All Symlinks in the Linux Directory
The symbolic link, also known as symlink or soft link, is the file type that can hold the location of a file or directory in any Linux file system. You have created a couple of Symbolic links in your Linux filesystem, and sometimes there comes a need to list all the symbolic links. This post provides you with a step-by-step guide on how to list all symlinks in a Linux filesystem or a specific Linux directory.
From a couple of ways to list all the symbolic links in a Linux directory, we will follow the reliable and best way using the find command.
List All Symbolic Links Using the Find Command
Find command comes in handy when finding any type of file or folder in a Linux operating system.
Syntax
To find the symbolic links in any Linux operating system, the syntax is as follows:
is the location or directory name in which you want to search for the symbolic link,
-type is referencing the file type,
while l is representing the link file type.
Alright, let’s have a look at the examples and see how can we get the symbolic links listed in different ways by going through a couple of examples:
Examples
Using the find command, we can list the symlinks from the entire filesystem or in a specific directory. Let’s take a look at each example:
List All Symlinks From the Entire Filesystem
To list all the symlinks from the entire filesystem, you can execute the following find command by providing the “/” as path:
The “/” in the above command represents the entire file system, and the find command will search for the symbolic links from all over the system and list them out in the terminal.
List All Symlinks in the Current Working Directory
Similarly, if you want to find and list all the symlinks in the current working directory, then simply provide the “.” as a path to the find command as shown below:
In the above command, the “.” tells the find command to find the symlinks in the current working directory.
List All Symlinks in Any Directory
To list all the symlinks in any directory, just provide the directory path to the find command as shown below:
The find command will look for the symbolic links in the /var/www/ directory only and list out all the symbolic links in that directory.
List All Symlinks in a Directory Using Maxdepth Flag
You might have noticed that all the above commands displayed the symbolic links in the desired directory and showed all the symbolic links from the subdirectories, as well.
So, what if you do not want to go into this much depth? You just want to have the symbolic links in the specified directory. The solution to that problem is not rocket science, and we can quickly mention the depth using the maxdepth flag.
For example, to set the search depth to level one, the find command would go like this:
You can witness the output shown in the screenshot given above. The find command has shown only the symbolic links of the current working directory instead of all the subdirectories.
Conclusion
This post has provided multiple ways and gives a brief explanation on how to list all the symbolic links in the Linux filesystem or a specific Linux directory. Using the find command, we have learned to find and list down all the symbolic links and set the maximum depth level using the maxdepth flag. If you want to learn and explore more about the find command, feel free to read the man page of find using the “man find” command.
About the author
Shehroz Azam
A Javascript Developer & Linux enthusiast with 4 years of industrial experience and proven know-how to combine creative and usability viewpoints resulting in world-class web applications. I have experience working with Vue, React & Node.js & currently working on article writing and video creation.
How do I find all of the symlinks in a directory tree?
I’m trying to find all of the symlinks within a directory tree for my website. I know that I can use find to do this but I can’t figure out how to recursively check the directories. I’ve tried this command:
it take a while to run, however I’m getting no matches. How do I get this to check subdirectories?
8 Answers 8
This will recursively traverse the /path/to/folder directory and list only the symbolic links:
ls -lR /path/to/folder | grep '^l'
If your intention is to follow the symbolic links too, you should use your find command but you should include the -L option; in fact the find man page says:
-L Follow symbolic links. When find examines or prints information about files, the information used shall be taken from the prop‐ erties of the file to which the link points, not from the link itself (unless it is a broken symbolic link or find is unable to examine the file to which the link points). Use of this option implies -noleaf. If you later use the -P option, -noleaf will still be in effect. If -L is in effect and find discovers a symbolic link to a subdirectory during its search, the subdirec‐ tory pointed to by the symbolic link will be searched. When the -L option is in effect, the -type predicate will always match against the type of the file that a symbolic link points to rather than the link itself (unless the symbolic link is bro‐ ken). Using -L causes the -lname and -ilname predicates always to return false.
This will probably work: I found in the find man page this diamond: if you are using the -type option you have to change it to the -xtype option:
l symbolic link; this is never true if the -L option or the -follow option is in effect, unless the symbolic link is broken. If you want to search for symbolic links when -L is in effect, use -xtype.
How to find and list all the symbolic links created for a particular file?
I had created many symbolic links on various paths for a particular file or a directory. I want the whole list of created symbolic links paths (location).
Example:
I created symbolic links for ~/Pictures directory on many directories. How do I list all the symlinks to that ~/Pictures directory? Is that possible? If yes, then how?
You need to search exhaustive, there is no count stored like there is for hard-links. See one of the answers using find.
4 Answers 4
find -L /dir/to/start -xtype l -samefile ~/Pictures
find -L /dir/to/start -xtype l -samefile ~/Pictures 2>/dev/null
to get rid of some errors like Permission denied , Too many levels of symbolic links , or File system loop detected which find throws them when doesn’t have the right permissions or other situations.
- -L — Follow symbolic links.
- -xtype l — File is symbolic link
- -samefile name — File refers to the same inode as name . When -L is in effect, this can include symbolic links.
Could the command be modified to find symbolic link that contains a path? e.g. files across the system that may link to ~/Pictures/A, ~/Pictures/A/B/C, or any files in the subdirectories of ~/Pictures>
Very simple, use option -lname :
find / -lname /path/to/original/dir
-lname pattern File is a symbolic link whose contents match shell pattern pattern. The metacharacters do not treat `/' or `.' specially. If the -L option or the -follow option is in effect, this test returns false unless the symbolic link is broken.
Note: Remember that symbolic links could be anywhere, which includes a remote system (if you’re sharing files), so you may not be able to locate them all.