Exclude directory in find

How can I find every file and directory matching a pattern, excluding one directory using find?

Say I have the following file structure;

.
  foo-exclude-me/
    foo.txt
  foo-exclude-me-not/
    foo.txt
  bar/
    foo.txt
    foobar/
      bar.txt
      foofoo.txt

how would I get the following output using find:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

I have tried using both of the following command:

find . -name 'foo-exclude-me' -prune -o -name 'foo*'
find . -name 'foo*' ! -path './foo-exclude-me/*'

but both of them return this:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

How can I properly exclude the foo-exclude-me directory?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

With no -print, the implicit default action applies to every match, even pruned ones. The explicit -print applies only under the specified conditions, which are -name 'foo*' only in the else branch of -name 'foo-exclude-me'.

Generally speaking, use an explicit -print whenever you’re doing something more complex than a conjunction of predicates.

Your second attempt with ! -path './foo-exclude-me/*' didn’t work because ./foo-exclude-me doesn’t match ./foo-exclude-me/* (no trailing /). Adding ! -path ./foo-exclude-me would work.

Method 2

-bash-4.1$ find . -exec ls -l {} + -name 'a.out' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

-rw-r--r--. 1 oradba dba  499 Jan 18 19:30 ./a.out
-rw-r--r--. 1 oradba dba  499 Jan 18 20:59 ./b.out
-rw-r--r--. 1 oradba dba  499 Jan 18 20:59 ./c.out
-rw-r--r--. 1 oradba dba  499 Jan 18 20:59 ./d.out

.:
total 16
-rw-r--r--. 1 oradba dba 499 Jan 18 19:30 a.out
-rw-r--r--. 1 oradba dba 499 Jan 18 20:59 b.out
-rw-r--r--. 1 oradba dba 499 Jan 18 20:59 c.out
-rw-r--r--. 1 oradba dba 499 Jan 18 20:59 d.out
rm: cannot remove `.': Is a directory
ls: cannot access ./b.out: No such file or directory
ls: cannot access ./d.out: No such file or directory
ls: cannot access ./c.out: No such file or directory
.:
total 4
-rw-r--r--. 1 oradba dba 499 Jan 18 19:30 a.out


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x