我有以下内容:
find . -type f | grep -E '\.(cpp|hpp|c|h)$'
我如何仅使用find命令来做到这一点?
答案 0 :(得分:2)
find . -type f -iname \*\.cpp -o -iname \*\.hpp -o -iname \*\.c -o -iname \*\.h
.
-在当前目录中查找-type f
-查找所有文件条目-iname \*\.cpp
-查找不区分大小写的文件名,该文件名是一个字符串(与*
反斜杠\
匹配,因此shell不会将其扩展为本地文件名)比.
反斜杠,因此它将不匹配任何字符(扩展名除外)-o
代表“或”,因此可以对多个条件进行“或” 另外,正如Matteo_Ragni在他的回答中指出的那样,您可以使用-regex
选项,在您的情况下,这可能会简单得多。
使用GNU find
可以将-regex
用于正确的模式
find . -type f -regex '.*\.[hpp|cpp|c|h]'
如@MatteoRagni所建议,最好使用像这样的正则表达式:
find -regex ".*\.\(hpp\|cpp\|c\|h\)$"
这主要取决于find
支持哪种正则表达式模式类型以及哪种默认模式。有关更多信息,请参阅参数-regex
,-regextype
和相应的正则表达式类型的正确文档。
答案 1 :(得分:0)
仅供参考,没有find
命令,但带有bash
选项和路径名扩展:
shopt -s globstar extglob
ls **/?(*.[ch]pp|*.[ch])
shopt
是bash
内置命令,用于设置(带有-s
)选项。
bash
选项globstar
启用**
模式以浏览到嵌套目录,而选项extglob
启用?(...)
模式以匹配不同的文件扩展名
答案 2 :(得分:0)
Grep 查找所有出现的 .c
.h
.cpp
grep '\.[chp]' file