- How to list all symbolic links in a directory
- 10 Answers 10
- Find All Symbolic Links in Linux
- Use find command to look for symbolic links
- Use the symlinks utility to find all symbolic links
- Symbolic Links are Easy!
- How to find and list all the symbolic links created for a particular file?
- Example:
- 4 Answers 4
- List symlinks in current directory?
- 4 Answers 4
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.
Find All Symbolic Links in Linux
Looking for all the soft links on your Linux system? Here are a couple of methods to find symbolic links.
How do you find a soft link?
You can use the ls command. Some distributions show the links in a different color. The long listing is always reliable because it shows links with l.
lrwxrwxrwx 1 abhishek abhishek 14 Jan 31 18:07 my_link -> redirects.yaml
This is okay if you have a couple of links in the current directory. But what if you want to see the links in a nested directory structure or the entire system?
In this tutorial, I will be showing you two ways to accomplish this mission:
So let’s start with the first one.
Use find command to look for symbolic links
To find the symbolic links using the find command, you can use the following command syntax:
find Target_directory -type l
For example, here, I searched for available symbolic links inside the Links directory:
But by default, the find command will initiate the recursive search and if you want to limit the search to a certain depth, you will have to use the -maxdepth flag.
So let’s say I want to restrict the search to level 1 for the Links directory, I will be using the following:
find Links/ -maxdepth 1 -type l
And if you want detailed output including the file permissions, user groups, etc. then you will have to pair the find command with -ls flag:
find Target_directory -type l -ls
If you want a system-wide search, you can use / in the command.
Use the symlinks utility to find all symbolic links
This tool is what I used while pursuing my internship in networking.
But it does not come pre-installed though. You can install it using your distribution’s package manager. For Ubuntu/Debian, use:
sudo apt install symlinks
Once you are done with the installation, use the given command structure to look for available symbolic links:
symlinks -v target_directory
Here, the -v option gives verbose output.
But by default, the symlinks utility won’t look into subdirectories. Enable recursive search with the -r option:
symlinks -vr target_directory
The output has specific terms. Let me explain them.
- relative indicates that links are relative to the current working directory in which the link resides.
- other_fs means the link is indicating a different filesystem. In my case, it is indicated to the external drive.
Symbolic Links are Easy!
Really, they might sound like a huge deal but we made sure to break the topic bit by bit.
Such as if you are a complete beginner, you can refer to the beginner’s guide to symbolic links:
And if you want to follow them to their origin, you can refer the following guide:
I hope you will find this guide helpful. And if you have any queries or suggestions, be my guest in the comments section.
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.
List symlinks in current directory?
On my Ubuntu system, a quick look at its man find shows that -d is a synonym for -depth (for compatibility with FreeBSD, NetBSD, MacOS X and OpenBSD.), ie. it is not the same as -maxdepth . . . -depth Process each directory’s contents before the directory itself
4 Answers 4
In zsh (add N inside the parentheses to include symlinks whose name begins with a . ):
With most find implementations:
find . -type d \! -name . -prune -o -type l -print
for x in * .*; do if [ -h "$x" ]; then echo "$x"; done done
For the -prune option, you need to use find topdir ! -name topdir -prune ; otherwise the starting directory is ignored as well.
You should be using -type and not -xtype :
-xtype c The same as -type unless the file is a symbolic link. For sym‐ bolic links: if the -H or -P option was specified, true if the file is a link to a file of type c; if the -L option has been given, true if c is `l'. In other words, for symbolic links, -xtype checks the type of the file that -type does not check.
The default is -P , so the -xtype option will try to determine the resultant file, not the symlink itself. Actually, I get some positive results, which seems like a bug. The -P -xtype l should return true (on a symlink) iff the resultant is itself a symbolic link.
Can also use: ls -FA | sed -ne ‘s/@//p’ which will display only the symlinks.