3

I have a bunch of folders/files that are 10+ levels deep.

How can I find any symbolic links that point outside this folder tree?

I tried find -type l but this returns all soft links... even those whose destination is with in the folder tree.

Thank you

nonot1
  • 1,069
  • 1
  • 12
  • 16

1 Answers1

3

If all of the symbolic link targets are absolute, you can do something like this:

find /folder/tree -type l -not -lname '/folder/tree/*' -print

However, if you have any relative links in your tree, especially those with ./ or ../ embedded in the target paths, you'll probably need to loop through each one to normalize the target, and then see if it matches the folder tree:

find /folder/tree -type l -print | \
    while read symlink
    do
        target=$(readlink -f "$symlink")
        expr match "$target" "^/folder/tree/.*" >/dev/null || echo "$symlink"
    done
# end of pipeline

Both do the same thing, which is to print each symbolic link that has a target not matching /folder/tree.

James Sneeringer
  • 6,755
  • 23
  • 27