You need the `-prune` sub-expression to occur before the main search sub-expression. BTW, you can combine all the names into a compound expression with a single `-prune` like this: find \( \( -name '*foo*' -o -name '*bar*' \) -a -prune \) -o \( -name baz -a -print \) Note: I'm being liberal with the `-a`/`-o` operators and the parentheses so there is no ambiguity. And it's a good idea to be explicit with the `-print` action to distinguish it from the `-prune` part. This means I want to find files named `baz` while excluding any files/directories containing `foo` or `bar` in their names.