Exclude a sub-directory using find
-name
only matches the filename, not the whole path. You want to use -path
instead, for the parts in which you are pruning the directories like def/incoming
.
This works:
find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"
Explanation:
find /home/feeds/data
: start finding recursively from specified path-type f
: find files only-not -path "*def/incoming*"
: don't include anything withdef/incoming
as part of its path-not -path "*456/incoming*"
: don't include anything with456/incoming
as part of its path
Just for the sake of documentation: You might have to dig deeper as there are many search'n'skip constellations (like I had to). It might turn out that prune
is your friend while -not -path
won't do what you expect.
So this is a valuable example of 15 find examples that exclude directories:
http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html
To link to the initial question, excluding finally worked for me like this:
find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print
Then, if you wish to find one file and still exclude pathes, just add | grep myFile.txt
.
It may depend also on your find version. I see:
$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX