How do I make find follow most, but not all, symbolic links?
The -prune
primary tells find
not to recurse under a directory.
find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print
If you want to use -lname
in your condition, you can't use the -L
option, because -L
causes most predicates to act on the target of the link, including -lname
. My recommendation in that case would be to use both your home directory and the hard disk root as the roots of your search.
find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'
You might run find ~ -type l …
to gather a list of symbolic links and use them as additional roots.
( IFS=$'\n'; set -f;
find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
-xtype f -name 'My Favorite Movie.*' )
If you really want to recurse under symbolic links, you can exclude specific symbolic links by target instead of by name. However you can only exclude a finite list, not a pattern or subtree this way.
find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
-type f -name 'My Favorite Movie.*' -print
You can use other criteria such as ! -writable
(files that you don't have write permission to), but I don't think GNU find has a way to recurse under symbolic links only if their target text matches a certain expression.
You could build a find
command that does almost what you want except for not excluding enough symbolic links, run find2perl to convert the query to a Perl script, and tweak the Perl script a bit. There are many switches of GNU find that find2perl doesn't recognize, however.