- How to list all symbolic links in a directory
- 10 Answers 10
- How to find and list all the symbolic links created for a particular file?
- Example:
- 4 Answers 4
- How to get a list of Symbolic Links on Linux
- Three Ways of listing Symbolic Links on Linux
- Method # 1: Finding all the Symbolic Links of the Current File System:
- Method # 2: Finding all the Symbolic Links of the Current Working Directory
- Method # 3: Finding all the Symbolic Links of any Specific Directory
- Conclusion
- Search
- About This Site
- Latest Tutorials
- How do I find all of the symlinks in a directory tree?
- 8 Answers 8
How to list all symbolic links in a directory
I have a symbolic link in my /var/www/ directory that links to WordPress. When I run the command ls -la from the /var/www/ directory the link to WordPress doesn’t show up. Is there a way to list all of the symbolic links that are in a directory?
10 Answers 10
Parsing ls is a Bad Idea®, prefer a simple find in that case:
To only process the current directory:
find . -maxdepth 1 -type l -ls
Great answer! I adjusted mine to not descend down directory path like this: find /
@GabrielStaples from man find: -ls True; list current file in ls -dils format on standard output. Useful to see ./os-release -> ../usr/lib/os-release in /etc rather than just ./os-release
You can use grep with ls command to list all the symbolic links present in the current directory.
This will list all the links present in the current directory.
Please, do not use ls for scripting. Also mentioned in other answers. More: mywiki.wooledge.org/ParsingLs
ls -lhaF | grep ^l # list links ls -lhaF | grep ^d # list directories ls -lhaF | grep ^- # list files
This will list lines starting with «l» which represent Links in the perms column in place of l use d for directories and — for files
Just don’t do anything with this method programatically since malicious filenames can end up injecting shell code. To be safe, one should use the find command with -exec , and if piping to xargs , use the null-character separator output flag of find combined with the null-character separator input flag of xargs .
@MtlDev ! negates the condition matching, here ! -name . means matching everything except current directory.
This returns all symbolically linked items (both dirs & fns) in a directory:
find . -maxdepth 1 -type l -print | cut -c3- | grep -v "\#"
However, in order to distinguish between actual symbolically linked item types:
ls -lhaF | grep ^l | grep -v "\#" | cut -c42- | grep -v "/" | cut -d' ' -f1
Returns symbolically linked filename items only. And,
ls -lhaF | grep ^l | grep -v "\#" | cut -c42- | grep "/" | cut -d' ' -f1
Returns symbolically linked dirname items only.
To view the symbolic links in a directory:
- Open a terminal and move to that directory.
- Type the command:
ls -l *(@) lrwxrwxrwx 1 david david 15 Nov 18 22:35 gvimrc -> /etc/vim/gvimrc lrwxrwxrwx 1 david david 13 Nov 18 22:19 mydomains.php -> mydomains.php
Type ls -lai ,it will list all the files and subdirectories with corresponding inode numbers.You know files with same inode number are the links(hard or soft) and this solution also works for the symbolic links.
ls -lai does not show the same inode number for a file and its symbolic links. Unlike hard links, symbolic links have their own separate inode entries. This is what it looks like.
Can be done with python as well:
$ python -c "import os,sys; print '\n'.join([os.path.join(sys.argv[1],i) for i in os.listdir(sys.argv[1]) if os.path.islink(os.path.join(sys.argv[1],i))])" /path/to/dir
$ python -c "import os,sys; print '\n'.join([os.path.join(sys.argv[1],i) for i in os.listdir(sys.argv[1]) if os.path.islink(os.path.join(sys.argv[1],i))])" /etc /etc/vtrgb /etc/printcap /etc/resolv.conf /etc/os-release /etc/mtab /etc/localtime
This can be extended to be recursive via os.walk function, but it’s sufficient to use simple list generation for listing links in a single directory as I showed above.
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.
How to get a list of Symbolic Links on Linux
A symbolic link also known as a soft link is a kind of a pointer that points to the location of a folder or a file on your system. Some of these links are created by default on your system, whereas you yourself can also create symbolic links manually for any of your desired files or folders. This article will explain to you the different methods through which you can list down all symbolic links on Linux, I have used Linux Mint 20 for this guide, but the same steps will work on any Linux distribution.
Three Ways of listing Symbolic Links on Linux
For listing down all the symbolic links in Linux Mint 20 depending upon your exact requirements, you can pick any of the following three methods:
Method # 1: Finding all the Symbolic Links of the Current File System:
If you want to list down all the symbolic links of your current file system in Linux Mint 20, then you can do this by executing the command shown below:
This variation of the “find” command will take a reasonable time to execute since it has to traverse through your whole file system for finding all the symbolic links that it has. After its execution, you will be able to see a very long list of all the symbolic links within your current file system as shown in the following image:
Method # 2: Finding all the Symbolic Links of the Current Working Directory
Now, if you want to find all the symbolic links of your current working directory, then you can do this by executing the command shown below:
This command will execute relatively quickly after which you will be able to see a list of all the symbolic links of your current working directory as shown in the following image:
Method # 3: Finding all the Symbolic Links of any Specific Directory
You can even list down all the symbolic links of any specific directory with the help of the command shown below:
$ sudo find DirectoryName -type l
You need to replace DirectoryName with the name of the directory whose symbolic links you want to find along with its complete path.
This command will also execute readily after which you will be able to see a list of all the symbolic links of your specified directory as shown in the following image:
Conclusion
Depending upon your usage requirements, you can pick any of the three methods discussed in this article for listing down all the symbolic links of your system. All of these methods are based on one-liner commands, therefore, you will be able to perform them very quickly.
Search
About This Site
Vitux.com aims to become a Linux compendium with lots of unique and up to date tutorials.
Latest Tutorials
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.