How to use shell magic to create a recursive etags using GNU etags?

bash, c++, etag, exuberant-ctags, gnu

Solution

The Emacs Wiki is often a good source for answers to common problems or best practices. For your specific problem there is a solution for both Windows and Unixen:

http://www.emacswiki.org/emacs/RecursiveTags#toc2

Basically you run a command to find all `.cpp` and all `.h` files (change file selectors if you use different file endings, such as e.g., `.C`) and pipe the result into etags. Since Windows does not seem to have xargs, you need a more recent version of etags that can read from stdin (note the dash at the end of the line which symbolizes stdin). Of course, if you use a recent version of etags, you can use the dash parameter instead of xargs there, too.

Windows:

cd c:\source-root
dir /b /s *.cpp *.h *.hpp | etags --your_options -

Unix:

cd /path/to/source-root
find . -name "*.cpp" -print -or -name "*.h" -print | xargs etags --append

Problem

The standard GNU `etags` does not support a recursive walk of directories as done by exuberant `ctags -R`. If I only have access to the GNU etags, how can I use bash shell magic to get etags to produce a TAGS table for all the C++ files `*.cpp` and `*.h` files in the current directory and all directories below the current one recursively to create a TAGS table in the current directory which has the proper path name for `emacs` to resolve the TAGS table entries.

Original source