Why does grep return no results (list all files in directory)
I'm trying to count all files in a directory that match a pattern, recursively, using ls
:
ls -R | grep *.{cpp,h} | wc
However, I get:
zsh: no matches found: *.cpp
ls -R
does return results, though:
$ 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
Why doesn't grep
find the *.cpp
files that ls -R
returns?
Edit: I'm also pretty sure that ls -R | grep *.{cpp,h} | wc
is not the best way to do this, because of the way that ls
returns multiple results on single lines, but I'm not certain.
You're making two different mistakes that play together. First, you need to quote the pattern sent to grep
, otherwise the shell will expand it first. (That's where the error message comes from.) Second, grep
does not accept shell globs, it wants a regex.
zsh
being what it is, you may want to say
$ ls **/*.{cpp,h} | wc -l
instead, using a zsh
-style recursive glob. If you want to use the other one, it's
$ ls -R | egrep '\.(cpp|h)$' | wc -l