我正在尝试以递归方式计算目录中与某个模式匹配的所有文件,使用方法如下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
文件?*.cpp
ls -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