Por que o grep não retorna nenhum resultado (lista todos os arquivos no diretório)

3

Estou tentando contar todos os arquivos em um diretório que corresponda a um padrão, de forma recursiva, usando ls :

ls -R | grep *.{cpp,h} | wc

No entanto, recebo:

zsh: no matches found: *.cpp

ls -R retorna os resultados, no entanto:

$ ls -R CMakeLists.txt cmake src

./cmake: Modules SUBS.cmake

./cmake/Modules: FindGecode.cmake

./src: A1_examples.h Sub1Main.cpp Sudoku.cpp Sudoku.h nQueens.cpp

Por que grep não encontra os arquivos *.cpp que ls -R retorna?

Editar: também tenho certeza de que ls -R | grep *.{cpp,h} | wc não é a melhor maneira de fazer isso, devido à maneira como ls retorna vários resultados em linhas simples, mas não tenho certeza.

    
por simont 09.04.2012 / 13:59

1 resposta

4

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
    
por 09.04.2012 / 14:05

Tags