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