Is there a way to check if there are symbolic links pointing to a directory?

Go To StackoverFlow.com

58

I have a folder on my server to which I had a number of symbolic links pointing. I've since created a new folder and I want to change all those symbolic links to point to the new folder. I'd considered replacing the original folder with a symlink to the new folder, but it seems that if I continued with that practice it could get very messy very fast.

What I've been doing is manually changing the symlinks to point to the new folder, but I may have missed a couple.

Is there a way to check if there are any symlinks pointing to a particular folder?

2008-09-19 07:08
by nickf


73

I'd use the find command.

find . -lname /particular/folder

That will recursively search the current directory for symlinks to /particular/folder. Note that it will only find absolute symlinks. A similar command can be used to search for all symlinks pointing at objects called "folder":

find . -lname '*folder'

From there you would need to weed out any false positives.

2008-09-19 07:15
by skymt
thanks, that worked well. for anyone else trying this one: using the -maxdepth switch really helped speed up the search, since i knew at what depth the links would be - nickf 2008-09-19 08:25
Wow, this is exactly what I was looking for. Thanks skymt for the answer and @nickf for asking the question : - icasimpan 2012-01-19 11:08
Thanks. Just be careful that presence of a trailing slash or not in the link may alter result. So you may need a find . -lname '*folder?'regilero 2013-07-02 09:30
... and for each match, find also what points to that match ! (ex: /a/A -> /some/b -> /particular/folder ... the chain could be even longer - Olivier Dulac 2013-11-07 17:33


7

You can audit symlinks with the symlinks program written by Mark Lord -- it will scan an entire filesystem, normalize symlink paths to absolute form and print them to stdout.

2012-03-13 10:46
by JJK


5

There isn't really any direct way to check for such symlinks. Consider that you might have a filesystem that isn't mounted all the time (eg. an external USB drive), which could contain symlinks to another volume on the system.

You could do something with:

for a in `find / -type l`; do echo "$a -> `readlink $a`"; done | grep destfolder

I note that FreeBSD's find does not support the -lname option, which is why I ended up with the above.

2008-09-19 07:19
by Greg Hewgill


3

find . -type l -printf '%p -> %l\n'
2010-10-08 15:26
by no1uknow


2

Apart from looking at all other folders if there are links pointing to the original folder, I don't think it is possible. If it is, I would be interested.

2008-09-19 07:19
by stephanea


1

find / -lname 'fullyqualifiedpathoffile'
2008-09-19 07:16
by bfabry


1

For hardlinks, you can get the inode of your directory with one of the "ls" options (-i, I think).

Then a find with -inum will locate all common hardlinks.

For softlinks, you may have to do an ls -l on all files looking for the text after "->" and normalizing it to make sure it's an absolute path.

2008-09-19 07:17
by paxdiablo
This would work well for finding all hardlinks to a file. But hardlinks to a directory are a big no-no. The filesystem driver will not let you create such a thing, and if you are masochistic enough to go in and edit the raw partition by hand to create one, it makes many things very unhappy - Thomee 2008-09-19 16:41
I don't recommend hard links to folders either, but TimeMachine on OS X uses them. E.G: http://belkadan.com/blog/2011/07/rm-vs-Time-Machine - Tom Andersen 2012-10-29 17:06


1

find /foldername -type l -exec ls -lad {} \;
2014-01-03 12:50
by Lunar Mushrooms
This works great on the Mac. Thanks. Found some malicious symlinks on a site that was done by a wordpress hack. really. thanks - Vik 2014-09-24 12:30
Ads