如何使用Unix中的“find”命令查找所有的cpp和h文件?

32

我知道要查找所有的.h文件,我需要使用:

find . -name "*.h"

但是如何查找所有的.h.cpp文件?


可能是Unix find: multiple file types的重复问题。 - Eric Wilson
6个回答

47
find . -name \*.h -print -o -name \*.cpp -print
或者
find . \( -name \*.h -o -name \*.cpp \) -print

在过去的几年中,find 命令有所改变吗?我无法在 Ubuntu 9.10 或 OS X 10.6 中让它正常工作。它可以找到 .cpp 文件,但无法找到 .h 文件。示例:https://gist.github.com/783687 - Nate
1
尝试使用以下命令:find . -name \*.h -print -o -name \*.cpp -print - Paul Tomblin
2
或者,为了实现更好的代码重用性:find . \( -name '*.h' -o -name '*.cpp' \) -print - James Ko

14
find -name "*.h" -or -name "*.cpp"
(edited to protect the asterisks which were interpreted as formatting)

这只返回文件名完全为'.h'或'.cpp'的文件。需要使用通配符才能按预期工作:find -name "*.h" -or -name "*.cpp" - lmop
4
“-or”是GNUism。但是“-o”是标准的(POSIX)。 说明:该文句中出现的“GNUism”一词是指仅在GNU软件中存在的选项或功能,而不是POSIX标准所定义的内容。另外,“-or”和“-o”都是命令行参数中的逻辑或操作符,用于连接命令行选项。 - Jens
我可以确认在Ubuntu上以下命令是有效的:find ./ -name "*.h" -o -name "*.c*"(我不仅要查找cpp文件(C ++),还要查找cs文件(C#):-)) - Dominique

7
使用find的简洁明了的方法是:
find . -regex '.*\.\(cpp\|h\)'

-regex的man页面中写道:“这是对整个路径进行匹配,而不是搜索。”因此需要在路径前加上.*以匹配路径./dir1/dir2/...的开头,然后才能匹配文件名。


7

Paul Tomblin已经提供了出色的答案,但我认为你正在做一件事情中存在着一种模式。

很有可能有一天你会使用find生成一个文件列表,并使用grep进行处理,而为此存在一种更加用户友好的工具,Ack

它适用于任何支持perl的系统,且在目录中递归搜索所有C++相关文件以查找给定字符串非常简单。

ack "int\s+foo" --cpp 

"--cpp" 默认匹配 .cpp .cc .cxx .m .hpp .hh .h .hxx 文件

(它默认跳过仓库目录,因此不会匹配那些看起来像在其中的文件。)


3
find . -regex ".*\.[cChH]\(pp\)?" -print

这个在cygwin里对我来说测试通过了。


这也会找到扩展名为cCppHpp的文件,它们既不是cpp文件,也不是常见的扩展名。此外,您没有正确转义最后一个点,这意味着您还将匹配名为例如xcpp.C的数学文件。由于未掌握正则表达式和查找技巧,您引入了几个问题。 - Sebastian Mach

2

您可以使用以下简短形式的find

find \( -name '*.cpp' -o -name '*.h' \) -print
-print可以省略。在表达式之间仅使用-o是特别有用的,当你想查找多种类型的文件并执行同一项任务(比如计算md5sum)时。

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