Você está cometendo dois erros diferentes que jogam juntos. Primeiro, você precisa citar o padrão enviado para grep
, caso contrário, o shell o expandirá primeiro. (É daí que vem a mensagem de erro.) Segundo, grep
não aceita globs de shell, quer um regex.
zsh
sendo o que é, você pode querer dizer
$ ls **/*.{cpp,h} | wc -l
em vez disso, usando um glob recursivo com estilo zsh
. Se você quiser usar o outro, é
$ ls -R | egrep '\.(cpp|h)$' | wc -l