Unix查找:多个文件类型

71

我想使用多个文件类型运行find -name命令。例如:

 find -name *.h,*.cpp

这个可行吗?


2
原来,这个问题以前已经被问过了...对于相同的*.h*.cpp示例!https://dev59.com/YXVC5IYBdhLWcg3wfhKL - Eric Wilson
7个回答

99
$ find . -name '*.h' -o -name '*.cpp'
要在man页面中查找此信息,请键入man find,然后输入/OPERATORS进行搜索并按Enter。
在GNU find中,.不是必需的,但在Unix中是必需的。在任何情况下,引号都很重要,如果当前目录中出现这些类型的文件,则省略它们会导致错误。
在某些系统上(例如Cygwin),需要使用括号使扩展名集包含在内:
$ find . \( -name '*.h' -o -name '*.cpp' \)

括号不是必需的,但引用 *.h*.cpp 可能是必要的。 - Joachim Sauer
3
既然原帖提到了UNIX,那么“.”就是绝对必要的。GNU find则不需要。 - sehe
1
在我的Cygwin上,如果我使用Eric的示例,它可以正常运行。 但是,如果我在末尾添加“-print”,它只使用最后一个“-name”过滤器。 当我添加括号时,它可以与“-print”选项一起工作。Joachim,我认为你可能也是这样。 - Manuel Rozier
2
对于我在Ubuntu上的情况来说,当我想要将其管道传输到xargs时,括号似乎是必需的。如果没有它,它仍然会运行,但只使用我提到的最后一个扩展名。 - djangonaut
5
@Priyal -o 表示 "或"。 - Eric Wilson
显示剩余3条评论

20

这就是我使用的东西。

find . \( -name "*.h" -o -name "*.cpp" \) -print

5
除非您认为添加“-print”是新的且有用的信息,否则最好投票支持现有答案之一,而不是添加重复内容。 - Eric Wilson
8
括号很重要。 - Dr. Jan-Philip Gehrcke
1
有趣的是...你的解决方案对我有效...如果我不使用括号,它会失败并且只能找到第二种类型的文件。+1! - Jimbo

13

你也可以使用 -regex 工具:

find -E . -iregex ".*\.(js|jsx|html|htm)"

请记住,正则表达式查看完整的绝对路径:

有关该带测试用例解释的正则表达式,请访问:https://regex101.com/r/oY1vL2/1

-E(作为路径之前的标志)启用扩展(现代)正则表达式。

这适用于BSD find(Mac OSX 10.10.5)。


12
find . -name "*.h" -or -name "*.cpp"

对我来说可行。


有趣的是,我不知道你可以使用“-or”,我只看到过“-o”。它很有效,并且容易记住。 - Eric Wilson
5
请注意,并非所有版本的“find”命令(例如在Solaris中)都支持使用“-or”代替“-o”。 - Frank Meulenaar

8
find . -name '*.h' -o -name '*.cc'`

用于搜索文件的工具。

find . \( -name '*.h' -o -name '*.cc' \)`

用于执行命令的工具

find . \( -name '*.h' -o -name '*.cc' \) -exec egrep "#include" {} \; -print | egrep "^\."

感谢上一个例子,\( ... \) 需要在传递给 xargs 等命令时使用并不是显而易见的。如果没有大括号,命令总是只在最后一个扩展上执行。 - djangonaut

6

这是我使用的方法。我强烈推荐使用"-regextype posix-extended"参数。

find . -type f -iname "*.log" -o -iname "*.gz" 
find . -type f \( -name "*.gz" -o -name "*.log" \)
find . -type f -regex '.*\(\.gz\|\.log\)'
find . -type f -regextype posix-extended -regex '.*.(log|gz)'

0
find ./ -name *.csv -o \\-name *.txt|xargs grep -i new

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接