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 .ca#.c a’ charactera##.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