Grep provavelmente está funcionando corretamente. Seu comando é o que está desligado. Eu respondi algo semelhante antes aqui , sobre chown on UNIX, com um shell UNIX. Algumas das explicações podem ser úteis.
Se você quiser verificar usando o sinalizador recursivo, deseja passar um diretório:
grep -r fred .
Isto irá encontrar o fred em qualquer arquivo enraizado no., chamado * .txt ou não.
Se você quiser limitar isso apenas a arquivos com o nome * .txt, você pode fazer isso com o próprio grep:
grep -r fred . | grep '^[^:]*\.txt:'
Isso obviamente é um pouco desajeitado para digitar todas as vezes, mas funciona.
Uma maneira mais limpa é usar um shell estilo UNIX (ou pelo menos é muito difícil de fazer no prompt de comando, não sei como fazer isso).
No unix, para comandos recursivos, você geralmente usa o padrão
find file_selection_criteria | xargs command whatever_args
Neste caso, seria:
find . -name '*.txt' | xargs grep fred
Como uma coisa mais simples, se você baixou um shell bastante recente como o bash4 ou o zsh, você poderia usar o novo glob recursivo (double *):
shopt -s globstar # needed for bash4
grep fred ./**/*.txt
Então, isso realmente depende de quanto trabalho você gostaria de fazer. Se você quer apenas ter o grep funcionando agora, talvez você use o primeiro, e filtre qualquer coisa que não tenha o nome .txt. Se você fizer isso com frequência, talvez valha a pena investir na obtenção de um shell semelhante ao UNIX. Você pode obter um do Cygwin ou usar uma ou duas ferramentas de MinGW