## 9.27. Skipping Parts of a Tree in find

Q: I want to run find across a directory tree, skipping standard directories like /usr/spool and /usr/local/bin. A -name dirname -prune clause won't do it because -name doesn't match the whole pathname -- just each part of it, such as spool or local. How can I make find match the whole pathname, like /usr/local/bin/, instead of all directories named bin?

A: It cannot be done directly. You can do this:

>     % find /path -exec test {} = /foo/bar -o {} = /foo/baz \; -prune -o pred

This will not perform pred on /foo/bar and /foo/baz; if you want them done, but not any files within them, try:

>     % find /path \( -exec test test-exprs \; ! -prune \) -o pred

The second version is worth close study, keeping the manual for find at hand for reference. It shows a great deal about how find works.

The -prune operator simply says "do not search the current path any deeper" and then succeeds a la -print.

Q: I only want a list of pathnames; the pred I use in your earlier answer will be just -print. I think I could solve my particular problem by piping the find output through a sed or egrep -v filter that deletes the pathnames I don't want to see.

A: That would probably be fastest. Using test runs the test program for each file name, which is quite slow. Take a peek at locate, described in Section 9.18.

There's more about complex find expressions in other articles, especially Section 9.6 and Section 9.12.

--CT and JP

Copyright © 2003 O'Reilly & Associates. All rights reserved.