List all symbolic links to valid directories only with find

directoryfindsymlink

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?

Best Answer

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/**/*(@-/)