Find “.git” dirs but ignore some paths; or how does `find -not` work

find

I can't figure out how the find -not works.

Let's say that I would like to locate all .git dirs in the tree.

find -type d -iname .git

No problems, but then let's say that I have some dirs that I don't like to be included, in question they can be called "old" and "backup".

I could pipe to grep -v and that will work just fine.

find -type d -iname .git | grep -v old | grep -v backup

But when I browsed the man page for find I noticed that there is a -not, but I can't figure out how it is intended to work.

I tried like this, but he does not exclude the old dir.

find -type d -iname .git -not -iname old 

How does the find -not work? Can I use it for this find of problem?

Best Answer

find has a little bit of sophistication to deal with this case:

If the expression contains no actions other than -prune, -print is performed on all files for which the expression is true.

So explicitly print just the parts you want:

find -type d \( -iname old -prune -o -iname backup -prune -o -iname .git -print \)

avoids searching the old and backup trees at all.

Related Question