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

1 Answer 1


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
        target=$(readlink -f "$symlink")
        expr match "$target" "^/folder/tree/.*" >/dev/null || echo "$symlink"
# end of pipeline

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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .