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.