7

I can use

find /search/location -type l 

to list all symbolic links inside /search/location.

How do I limit the output of find to symbolic links that refer to a valid directory, and exclude both, broken symbolic links and links to files?

3 Answers 3

8

With GNU find (the implementation on non-embedded Linux and Cygwin):

find /search/location -type l -xtype d 

With find implementations that lack the -xtype primary, you can use two invocations of find, one to filter symbolic links and one to filter the ones that point to directories:

find /search/location -type l -exec sh -c 'find -L "$@" -type d -print' _ {} + 

or you can call the test program:

find /search/location -type l -exec test {} \; -print 

Alternatively, if you have zsh, it's just a matter of two glob qualifiers (@ = is a symbolic link, - = the following qualifiers act on the link target, / = is a directory):

print -lr /search/location/**/*(@-/) 
1
  • find . -type l -exec sh -c 'find "$@" -L -type d -print' _ {} + yielded find: unknown predicate `-L' for me. moving the -L in the second find invocation before the "$@" made this work. Commented Aug 22, 2021 at 16:29
1

Try:

find /search/location -type l -exec test -e {} \; -print 

From man test:

 -e FILE FILE exists 

You might also benefit from this U&L answer to How can I find broken symlinks; be sure to read the comments too.

Edit: test -d to check if "FILE exists and is a directory"

find /search/location -type l -exec test -d {} \; -print 
0
0

Here you go:

for i in $(find /search/location -type l); do test -d $(readlink $i) && echo $i done 
1

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.