我正在 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
包含include
和Sample.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/null
过grep
文件名?该-H
选项可以做到这一点。)
答案2
有了现代,你根本grep
不需要例如find
grep -r --include='*.cpp' --include='*.h' 'include' . | grep 'Sample\.h'
或者 - 更好(假设搜索词的顺序明确)
grep -r --include='*.cpp' --include='*.h' 'include.*Sample\.h' .