如何在不同类型的文件中查找

如何在不同类型的文件中查找

我正在 Windows-10 PC 上开发 Ubuntu Windows 应用程序,其结果uname -a如下:

Linux DOMINIQUEDS 4.4.0-17134-Microsoft #48-Microsoft Fri Apr 27 18:06:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux

我正在做一些 C++ 开发,我想知道哪些源文件(*.cpp*.h)包含该文件Sample.h,因此我启动了以下命令:

find ./ -name "*.cpp" -or -name "*.h" -exec grep -i "include" {} /dev/null \; | grep "Sample.h"

这似乎不起作用:只给出了*.h包含includeSample.h位于同一行的文件。

但是我确信-o查找不同类型文件的构造是正确的:

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

*.cpp=> 在这里我得到了和文件的列表*.h

这给我留下了两种可能性:

  • 要么行为是正确的:该-exec参数仅用于最后一个find结果。在这种情况下,有人能告诉我如何-exec对所有find结果执行该操作吗?
  • 要么这种行为是错误的。在这种情况下,有人知道这是否是一般的 Ubuntu 问题/Windows-10 Ubuntu 应用程序问题/……以及是否可以期待任何解决方案以及何时?

提前致谢

答案1

但是我确信用于查找不同类型文件的 -o 构造是正确的:

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

没错,但的优先级-or并不高。从man find

   Please note that -a when specified implicitly (for example by two tests
   appearing  without an explicit operator between them) or explicitly has
   higher precedence than -o.  This means that find . -name afile -o -name
   bfile -print will never print afile.

所以:

-name "*.cpp" -or -name "*.h" -exec grep ...

就好像:

-name "*.cpp" -or ( -name "*.h" -exec grep ... )

而不是像:

( -name "*.cpp" -or -name "*.h" ) -exec grep ...

你需要:

find . \( -name '*.cpp' -o -name '*.h' \) -exec grep -H '#include.*Sample\.h' {} +

(我假设您曾经打印/dev/nullgrep文件名?该-H选项可以做到这一点。)

答案2

有了现代,你根本grep不需要例如find

grep -r --include='*.cpp' --include='*.h' 'include' . | grep 'Sample\.h'

或者 - 更好(假设搜索词的顺序明确)

grep -r --include='*.cpp' --include='*.h' 'include.*Sample\.h' .

相关内容