使用regex和'find'命令查找* .cpp,*。hpp,*。c和* h文件

时间:2018-11-05 09:49:58

标签: bash

我有以下内容:

find . -type f | grep -E '\.(cpp|hpp|c|h)$'

我如何仅使用find命令来做到这一点?

3 个答案:

答案 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])

shoptbash内置命令,用于设置(带有-s)选项。

bash选项globstar启用**模式以浏览到嵌套目录,而选项extglob启用?(...)模式以匹配不同的文件扩展名

答案 2 :(得分:0)

Grep 查找所有出现的 .c .h .cpp

grep '\.[chp]' file