Thx for [3]. I usually just do
wc -l *.c */*.c */*/*.c */*/*/*.c */*/*/*/*.c */*/*/*/*/*.c */*/*/*/*/*/*.c wc -l *.c */*.c */*/*.c */*/*/*.c */*/*/*/*.c */*/*/*/*/*.c */*/*/*/*/*/*.c wc $(git ls-files '*.c')
This avoids counting things like generated code that is not checked in (lex.yy.c, y.tab.c or what have you), and any local test code or other junk you have laying around in the tree. wc -l $(find . -type f -name "*.c") bash$ shopt -s globstar
Then you can use double star syntax like this: bash$ wc **/*.c
The **/ will match any number of directory components, including zero; I think it's like *.c */*.c */*/*.c and so on, like what OP wrote.Somewhat sadly, the Glibc glob function does not have an equivalent GLOB_ option for this; it's just in Bash.
-bash: shopt: globstar: invalid shell option nameIn the git repo, there is a 2009-dated commit 3185942a5234e26ab13fa02f9c51d340cec514f8 where the material appears, as a snapshot import.
Make sure you're using "shopt -s globstar" and not "shopt -o globstar".