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
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop












{ 11 comments… read them below or add one }
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
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
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
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
I’m just trying to exclude ONE directory, and the code doesn’t work. All directories are printed.
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
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
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.
Thanks for the article, using it and the man page, here is a version using wholename to ‘prune’ absolute paths:
Thomas
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?
find . -name “*.mp3″ -and -not -path “*Trash*”
will find all mp3 files and exclude any folder containing the letters “Trash”