Find Command Exclude Directories From Search Pattern

by on July 17, 2010 · 13 comments· LAST UPDATED July 17, 2010

in

How do I exclude certain directories while using the find command under UNIX or Linux operating systems?

You can use the find command as follows to find all directories except tmp directory:

find /path/to/dest -type d \( ! -name tmp \) -print

Find all directories except tmp and cache:

find /path/to/dest -type d \( ! -name tmp \) -o \( ! -name cache \) -print

The -prune option make sure that you do not descend into directory:

find /path/to/dest -type d \( ! -name tmp \) -o \( ! -name cache -prune \) -print

You can find all *.pl find except in tmp and root directory, enter:

find /  \( ! -name tmp \) -o \( ! -name root -prune \)  -name "*.pl" -print
TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 13 comments… read them below or add one }

1 kashyap January 25, 2011 at 9:47 am

find / \( ! -name tmp \) -o \( ! -name root -prune \) -name “*.pl” -print

it’s also displaying the files in tmp directory ?? this isn’t working
using findutils.x86_64 1:4.2.27-6.el5 version

Reply

2 narcis May 4, 2011 at 6:43 am

On my Ubuntu 11 this command will search for all “pl” files in the entire / dir but will not descend in /tmp:

find . -path ./tmp -prune -o -iname “**.pl” -print

Reply

3 sandeep May 10, 2011 at 10:07 am

To exclude multiple directories, the option to use is -a, which is AND operation; not -o as listed in the above article.

Therefore, to find all directories except tmp and cache

find /path/to/dest -type d \( ! -name tmp \) -a \( ! -name cache \) -print

Reply

4 sreedhar May 31, 2011 at 7:17 pm

we have the below directory structure:

/secure/data/bus/PREP_MDATA/preserve
/secure/data/bus/PREP_TDATA/preserve
/secure/data/bus/PREP_QDATA/preserve
/secure/data/bus/PREP_RDATA/preserve

I want to exclude the below 2 directories from my search but show up the other 2
/secure/data/bus/PREP_TDATA/preserve
/secure/data/bus/PREP_QDATA/preserve

How do I do that using the above stated commands.

Thanks for the help

Reply

5 Joe October 31, 2011 at 7:30 pm

I’m just trying to exclude ONE directory, and the code doesn’t work. All directories are printed.

Reply

6 Chris January 5, 2012 at 1:36 am

Joe,
Try this
This will list a non case sensitive list of all files with some phrase but will exlude some other folder with some non case sensitive phrase in it.
Remember if you just want it to list all files you can use * or *.ext for all files with .ext etc.
It seems counter intuitive to use the -o flag but it works here on csh

The dot right after the find command signifies THIS directory or whatever directory you are in. You can always replace that with another directory path.

find . -type f -iname “insert_file_names_you_want_listed_here” -print -o -type d -iname “insert_folder_name_you_dont_want_here” -prune

Reply

7 Simas August 1, 2012 at 8:52 am

Chris, thanks a lot, due to your post I was able to search for files containing “somephrase” in directory and its subdirs excluding some speciffic subdirectories with this command:
find /path/to/dir/ -exec grep -q somephrase {} \; -print -o -type d -wholename “/path/to/dir/speciffic/dir/*” -prune

hopefully somebody will find it usefull

Reply

8 Thomas A Andersion October 20, 2012 at 7:43 pm

find . \( -name results -prune \) -o \( -name typ_testout -prune \) -o \( -name obj-testgen -prune \) -o \( -name obj-sim -prune \) -o -type f -exec grep -w abf {} \; -print

I was trying to find the list of files having the string “abf”. But I wanted to exclude search results in the “results”, “typ_testout”, “obj-testgen”,”obj-sim” directories. So I used the above command and it worked perfectly fine for me. The secret is the “-o” option after each expression. So the find command matches against multiple expressions.

Reply

9 Thomas December 7, 2012 at 1:07 pm

Thanks for the article, using it and the man page, here is a version using wholename to ‘prune’ absolute paths:

find / \( -wholename '/home/*' -prune \) -o \( -wholename '/other/folder/*' -prune \) -o -name \*.bak -print

Thomas

Reply

10 lxdorney February 12, 2013 at 8:37 am

find all directories except tmp directory:
find /path/to/dest -maxdepth 2 -type d \( ! -name tmp \) -print
how about show only the directory with no subtmp?

Reply

11 Pr1y3nd March 18, 2013 at 7:12 pm

find . -name “*.mp3″ -and -not -path “*Trash*”
will find all mp3 files and exclude any folder containing the letters “Trash”

Reply

12 roan July 10, 2013 at 2:35 pm

+++ thank you, been looking to exclude my .svn folder when using find — this did the trick: find . -type f -and -not -path “*.svn*” -print

Reply

13 Sahil August 22, 2013 at 4:02 pm

Awesome!

Reply

Leave a Comment

Tagged as: , , , , , , , , , , ,

Previous Faq:

Next Faq: