## 9.11. Custom -exec Tests Applied

My favorite reason to use find 's -exec is for large recursive greps. Let's say I want to search through a large directory with lots of subdirectories to find all of the `.cc` files that call the method `GetRaw( )`:

>     % find . -name \*.cc -exec grep -n "GetRaw(" {} \; -print
>     58:    string Database::GetRaw(const Name &owner) const {
>     67:    string Database::GetRaw(const Name &owner,
>     ./db/Database.cc
>     39:            return new Object(owner, _database->GetRaw(owner));
>     51:    string Object::GetRaw(const Property& property) const {
>     52:        return _database->GetRaw(_owner, property);
>     86:            Properties properties(_database->GetRaw(owner));
>     103:        return _database->GetRaw(_owner);
>     ./db/Object.cc
>     71:        return new DatabaseObject(owner, GetDatabase( ).GetRaw(owner));
>     89:            return Sexp::Parse(GetRaw(property));
>     92:            SexpPtr parent = Sexp::Parse(GetRaw("_parent"))->Eval(this);
>     ./tlisp/Object.cc

This output is from a real source directory for an open source project I'm working on; it shows me each line that matched my grep along with its line number, followed by the name of the file where those lines were found. Most versions of grep can search recursively (using -R), but they search all files; you need find to grep through only certain files in a large directory tree.

--JP and DJPH

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