为什么 grep 不返回任何结果(列出目录中的所有文件)

为什么 grep 不返回任何结果(列出目录中的所有文件)

我正在尝试以递归方式计算目录中与某个模式匹配的所有文件,使用方法如下ls

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

然而,我得到:

zsh:未找到匹配项:*.cpp

ls -R但确实返回结果:

$ ls -R CMakeLists.txt cmake 源文件

./cmake:模块 SUBS.cmake

./cmake/模块: FindGecode.cmake

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

为什么找不到返回的grep文件?*.cppls -R

编辑:我也很确定这ls -R | grep *.{cpp,h} | wc不是最好的方法,因为这种方法ls会在单行上返回多个结果,但我不确定。

答案1

您犯了两个不同的错误,它们同时起作用。首先,您需要引用发送给 的模式grep,否则 shell 将首先对其进行扩展。(这就是错误消息的来源。)其次,grep不接受 shell 通配符,它​​需要一个正则表达式。

zsh你可能会想说

$ ls **/*.{cpp,h} | wc -l

而是使用zsh-style 递归 glob。如果你想使用另一个,它是

$ ls -R | egrep '\.(cpp|h)$' | wc -l

相关内容