Exclude range of directories in find command Exclude range of directories in find command shell shell

Exclude range of directories in find command


You can use wildcards in the pattern for the option -not -path:

find ./ -type f -name "*.bz2" -not -path "./0*/*" -not -path "./1*/*

this will exclude all directories starting with 0 or 1. Or even better:

find ./ -type f -name "*.bz2" -not -path "./[01]*/*"


Firstly, you can help find by using -prune rather than -not -path - that will avoid even looking inside the relevant directories.

To your main point - you can build a wildcard for your example (numeric 01 to 19):

find . -path './0[1-9]' -prune -o -path './1[0-9]' -prune -o -print

If your range is less convenient (e.g. 05 to 25) you might want to build the range into a bash variable, then interpolate that into the find command:

a=("-path ./"{05..25}" -prune -o")find . ${a[*]} -print -prune

(you might want to echo "${a[*]}" or printf '%s\n' ${a[*]} to see how it's working)


For me, I found the find command as a standalone tool somehow cumbersome. Therefore, I always end up using a combination of find just for the recursive file search and grep to make the actual exculsion/inclusion stuff. Finally I hand over the results to a third command which will perform the actions, like rm to remove files for example.

My generic command would look something like this:

find [root-path] | grep (-v)? -E "cond1|cond2|...|condN" | [action-performing-tool] 
  • root-path is where to start the search recursively
  • add -v option is used to invert the matching results.
  • cond1 - condN, the conditions for the matching. When -v is involed then this are the conditions to not match.
  • the action-performing-tool does the actual work

For example you want to remove all files not matching some conditions in the current directory:

find . -not -name "\." | grep -v -E "cond1|cond2|cond3|...|condN" | xargs rm -rf

As you can see, we are searching in the current directory indicated by the dot as root-path: then we want to invert the matching results, because we want all files not matching our conditions: and finally we pass all files found to rm in order to delete them: I add -rf to recursive/force delete all files. I used the find command with -not -name "." to exclude the current directory indicated normally by dot.

For the actuall question: Assume we have a directory using .git and .metadata directory and we want to exclude them in our search:

find . -not -name "\." | grep -v -E ".git|.metadata" | [action-performing-tool]

Hope that helps!