With zsh or eshell you can use **/*.[ch]
to expand into a list of all files matching *.[ch]
.
And so much more.
*.c
.c
?.c
.c
[a-f]*.c
a-f
followed by .c
a#.c
a
’ charactersa##.c
a
characters*/*.c
*/CVS/Root
e*(*)
e
*/*(@)
*/*(a+30)
*.c(:U)
All of these features are supported by both zsh[1] and Eshell. In fact, Eshell was implemented in terms of the zsh 4.0 InfoMode manual, so I recommend reading there. – JohnWiegley
Further, Eshell allows for Lisp ties in to the predication and filtering rules:
*.c('file-writable-p)
*.c(w)
*.c(|upcase)
*.c(:U)
See also:
M-x eshell-display-predicate-help
M-x eshell-display-modifier-help