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:
find /var/www/ -type l
… and later I discovered that the contents in /var/www
are symlinks, so I've changed the command to:
find -L /var/www/ -type l
it take a while to run, however I'm getting no matches.
How do I get this to check subdirectories?
Kindly find below one liner bash script command to find all broken symbolic links recursively in any linux based OS
a=$(find / -type l); for i in $(echo $a); do file $i ; done |grep -i broken 2> /dev/null
What I do is create a script in my bin directory that is like an alias. For example I have a script named lsd ls -l | grep ^d
you could make one lsl ls -lR | grep ^l
Just chmod them +x and you are good to go.
find
already looks recursively by default:
[15:21:53 ~]$ mkdir foo
[15:22:28 ~]$ cd foo
[15:22:31 ~/foo]$ mkdir bar
[15:22:35 ~/foo]$ cd bar
[15:22:36 ~/foo/bar]$ ln -s ../foo abc
[15:22:40 ~/foo/bar]$ cd ..
[15:22:47 ~/foo]$ ln -s foo abc
[15:22:52 ~/foo]$ find ./ -type l
.//abc
.//bar/abc
[15:22:57 ~/foo]$
This is the best thing I've found so far - shows you the symlinks in the current directory, recursively, but without following them, displayed with full paths and other information:
find ./ -type l -print0 | xargs -0 ls -plah
outputs looks about like this:
lrwxrwxrwx 1 apache develop 99 Dec 5 12:49 ./dir/dir2/symlink1 -> /dir3/symlinkTarget
lrwxrwxrwx 1 apache develop 81 Jan 10 14:02 ./dir1/dir2/dir4/symlink2 -> /dir5/whatever/symlink2Target
etc...
find . -type l -ls
Explanation: find
from the current directory .
onwards all references of -type l
ink and list -ls
those in detail.
Plain and simple...
Expanding upon this answer, here are a couple more symbolic link related find
commands:
find . -lname link_target
Note that link_target
is a pattern that may contain wildcard characters.
find -L . -type l -ls
The -L
option instructs find
to follow symbolic links, unless when broken.
find -L . -type l -delete -exec ln -s new_target {} \;
More find
examples can be found here: https://hamwaves.com/find/
To see just the symlinks themselves, you can use
find -L /path/to/dir/ -xtype l
while if you want to see also which files they target, just append an ls
find -L /path/to/dir/ -xtype l -exec ls -al {} \;
Source: Stackoverflow.com