- Exclude a directory or multiple directories while using find command
- Method 1 : Using the option “-prune -o”
- Method 2 : Using “! -path”
- Method 3 : Simple 🙂
- Excluding multiples directories
- Use find command but exclude files in two directories
- 6 Answers 6
- Explanation
- Exclude list of files from find
- 6 Answers 6
- Not the answer you’re looking for? Browse other questions tagged linux shell find or ask your own question.
- Linked
- Related
- Hot Network Questions
- Subscribe to RSS
- Find command Exclude or Ignore Files (e.g. Ignore All Hidden .dot Files )
- Find command exclude or ignore files syntax
- Examples: find command and logical operators
- Understanding find command operators
- How do I ignore hidden .dot files while searching for files?
- Say hello to -path option
- Find Command Exclude Directories From Search Pattern
Exclude a directory or multiple directories while using find command
Table of Contents
Is it possible to exclude a directory with find command? Exclude directories while doing running find command?
Yep, the command FIND has wide range of options to search what you actually looking for. I have already listed different switches and its usages with examples. Here we go for excluding some directories from our find job.
In some cases, we have to exclude some directories from our search pattern to improve the search speed or efficiency. If the server has a lot of directories and we are sure about that the file / directory that we are searching is not in some directories, we can directly exclude those to improve the performance. The result will be faster as compared to the full search.
There are different ways to exclude a directory or multiple directories in FIND command. Here I’m listing some methods!
To explain this, I created the following directories and files:
- “cry“, “bit” and “com” directories.
- ” findme “: The test file in all directories.
Lets see the output:
Method 1 : Using the option “-prune -o”
We can exclude directories by using the help of “path“, “prune“, “o” and “print” switches with find command.
See the example:
The directory “bit” will be excluded from the find search!
Method 2 : Using “! -path”
This is not much complicated compared to first method. See the example pasted below:
Method 3 : Simple 🙂
Yes, it’s very simple. We can ignore the location by using inverse grep “grep -v” option.
See the example:
Excluding multiples directories
Similar way we can exclude multiple directories also. See the sample outputs:
Источник
Use find command but exclude files in two directories
I want to find files that end with _peaks.bed , but exclude files in the tmp and scripts folders.
My command is like this:
But it didn’t work. The files in tmp and script folder will still be displayed.
Does anyone have ideas about this?
6 Answers 6
Here’s how you can specify that with find :
Explanation:
- find . — Start find from current working directory (recursively by default)
- -type f — Specify to find that you only want files in the results
- -name «*_peaks.bed» — Look for files with the name ending in _peaks.bed
- ! -path «./tmp/*» — Exclude all results whose path starts with ./tmp/
- ! -path «./scripts/*» — Also exclude all results whose path starts with ./scripts/
Testing the Solution:
You were pretty close, the -name option only considers the basename, where as -path considers the entire path =)
Here is one way you could do it.
The order is important. It evaluates from left to right. Always begin with the path exclusion.
Explanation
Do not use -not (or ! ) to exclude whole directory. Use -prune . As explained in the manual:
and in the GNU find manual:
Indeed, if you use -not -path «./pathname» , find will evaluate the expression for each node under «./pathname» .
find expressions are just condition evaluation.
- \( \) — groups operation (you can use -path «./tmp» -prune -o -path «./scripts» -prune -o , but it is more verbose).
- -path «./script» -prune — if -path returns true and is a directory, return true for that directory and do not descend into it.
- -path «./script» ! -prune — it evaluates as (-path «./script») AND (! -prune) . It revert the «always true» of prune to always false. It avoids printing «./script» as a match.
- -path «./script» -prune -false — since -prune always returns true, you can follow it with -false to do the same than ! .
- -o — OR operator. If no operator is specified between two expressions, it defaults to AND operator.
Hence, \( -path «./tmp» -o -path «./scripts» \) -prune -o -name «*_peaks.bed» -print is expanded to:
The print is important here because without it is expanded to:
-print is added by find — that is why most of the time, you do not need to add it in you expression. And since -prune returns true, it will print «./script» and «./tmp».
It is not necessary in the others because we switched -prune to always return false.
Hint: You can use find -D opt expr 2>&1 1>/dev/null to see how it is optimized and expanded,
find -D search expr 2>&1 1>/dev/null to see which path is checked.
Источник
Exclude list of files from find
If I have a list of filenames in a text file that I want to exclude when I run find , how can I do that? For example, I want to do something like:
and get all the .gz files in /dir except for the files listed in skip_files. But find has no -exclude_from flag. How can I skip all the files in skip_files ?
6 Answers 6
I don’t think find has an option like this, you could build a command using printf and your exclude list:
Which is the same as doing:
Alternatively you can pipe from find into grep :
This is what i usually do to remove some files from the result (In this case i looked for all text files but wasn’t interested in a bunch of valgrind memcheck reports we have here and there):
It seems to be working.
I think you can try like
The above command gives list of all files excluding files with .php, .jpg ang .png extension. This command works for me in putty.
Josh Jolly’s grep solution works, but has O(N**2) complexity, making it too slow for long lists. If the lists are sorted first (O(N*log(N)) complexity), you can use comm , which has O(N) complexity:
man your computer’s comm for details.
This solution will go through all files (not exactly excluding from the find command), but will produce an output skipping files from a list of exclusions. I found that useful while running a time-consuming command ( file /dir -exec md5sum <> \; ).
- You can create a shell script to handle the skipping logic and run commands on the files found (make it executable with chmod , replace echo with other commands):
- No ads and tracking
- In-depth guides for developers and sysadmins at Opensourceflare✨
- Join my Patreon to support independent content creators and start reading latest guides:
- How to set up Redis sentinel cluster on Ubuntu or Debian Linux
- How To Set Up SSH Keys With YubiKey as two-factor authentication (U2F/FIDO2)
- How to set up Mariadb Galera cluster on Ubuntu or Debian Linux
- A podman tutorial for beginners – part I (run Linux containers without Docker and in daemonless mode)
- How to protect Linux against rogue USB devices using USBGuard
Create a file with the list of files to skip named files_to_skip.txt (on the dir you are running from).
Then use find using it:
Not the answer you’re looking for? Browse other questions tagged linux shell find or ask your own question.
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.10.8.40416
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Источник
Find command Exclude or Ignore Files (e.g. Ignore All Hidden .dot Files )
Find command exclude or ignore files syntax
The syntax is as follows:
Examples: find command and logical operators
Find any file whose name ends with either ‘c’ or ‘asm’, enter:
$ find . -type f \( -iname «*.c» -or -iname «*.asm» \)
In this example, find all *.conf and (.txt) text files in the /etc/ directory:
$ find . -type f \( -name «*.conf» -or -name «*.txt» \) -print
Fig.01: Linux find command exclude files command
Understanding find command operators
Operators build a complex expression from tests and actions. The operators are, in order of decreasing precedence:
( expr ) | Force precedence. True if expr is true |
expr -not expr ! expr | True if expr is false. In some shells, it is necessary to protect the ‘!’ from shell interpretation by quoting it. |
expr1 -and expr2 | expr2 is not evaluated if expr1 is false. |
expr1 -or expr2 | expr2 is not evaluated if expr1 is true. |
How do I ignore hidden .dot files while searching for files?
Find *.txt file but ignore hidden .txt file such as .vimrc or .data.txt file:
$ find . -type f \( -iname «*.txt» ! -iname «.*» \)
Find all .dot files but ignore .htaccess file:
$ find . -type f \( -iname «.*» ! -iname «.htaccess» \)
Say hello to -path option
This option return true if the pathname being examined matches pattern. For example, find all *.txt files in the current directory but exclude ./Movies/, ./Downloads/, and ./Music/ folders:
Источник
Find Command Exclude Directories From Search Pattern
H ow 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 all directories except tmp and cache:
The -prune option make sure that you do not descend into directory:
Join Patreon ➔
You can find all *.pl find except in tmp and root directory, enter:
🐧 Get the latest tutorials on Linux, Open Source & DevOps via
Category | List of Unix and Linux commands |
---|---|
Documentation | help • mandb • man • pinfo |
Disk space analyzers | df • duf • ncdu • pydf |
File Management | cat • cp • less • mkdir • more • tree |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Linux Desktop Apps | Skype • Spotify • VLC 3 |
Modern utilities | bat • exa |
Network Utilities | NetHogs • dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • glances • gtop • jobs • killall • kill • pidof • pstree • pwdx • time • vtop |
Searching | ag • grep • whereis • which |
Shell builtins | compgen • echo • printf |
Text processing | cut • rev |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
Comments on this entry are closed.
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:
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”
+++ thank you, been looking to exclude my .svn folder when using find — this did the trick: find . -type f -and -not -path “*.svn*” -print
The real general problem is that of excluding certain directories by name, *AND ALSO AVOIDING TRAVERSING THEM* because they may contain *HUGE* subtrees that would take ages to scan, which is *PRECISELY* why we want to exclude them.
Additionally, the directories to be excluded may be located deeper than immediately below the start directory, i.e. if the intention is to exclude directories namet _thumb, then *ALL* of the following should be excluded:
./_thumb
./customer1/_thumb
./customer2/website4/_thumb
The answers above either don’t work at all, fail to avoid traversing the excluded directories, or would only exclude the first line.
Is the solution satisfying *ALL* the above requirements even possible with find?
Due to some bugs and versions of find, some works and not.
Though a simle find with grep will do.
Find the files and directories with ganglia on it, except for the directories with name Downloads.
sudo find / -iname “*ganglia*” | egrep -vi “downloads”
Or you can exclude specific directory like, find files or directories with ganglia except in the directory /home/simpleboy/Downloads
sudo find / -iname “*ganglia*” | egrep -v “\/home\/simpleboy\/Downloads”
Thanks More power nixCraft!
find / \( -path /exclude-folder1 -o -path /exclude-folder2 \) -prune -or -iname ‘*look-up*’ -exec ls -ld <> \;
Источник