views:

1224

answers:

6

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?

+3  A: 

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.

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
A: 

find / -lname 'fullyqualifiedpathoffile'

+1  A: 

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.

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
+1  A: 

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.

Greg Hewgill
A: 

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.

stephanea
A: 

find . -type l -printf '%p -> %l\n'

no1uknow