I prefer a slight change on the :bufdo answer.  I prefer the arg list instead of the buffer list, so I don't need to worry about closing current buffers or opening up new vim session.  For example:
:args ~/src/myproject/**/*.cpp | argdo execute "normal gg=G" | update
- argssets the arglist, using wildcards (- **will match the current directory as well as subdirectories)
- |lets us run multiple commands on one line
- argdoruns the following commands on each arg (it will swallow up the second- |)
- executeprevents- normalfrom swallowing up the next pipe.
- normalruns the following normal mode commands (what you were working with in the first place)
- updateis like- :w, but only saves when the buffer is modified.
This :args ... | argdo ... | update pattern is very useful for any sort of project wide file manipulation (e.g. search and replace via '%s/foo/bar/ge' or setting uniform fileformat or fileencoding).