Я работаю над Приложением Windows Ubuntu в своем Windows 10 PC, результате 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
результаты?Заранее спасибо
Однако я знаю наверняка, что-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
опция делает это.)
С современным grep
, Вам не нужно find
вообще, например.
grep -r --include='*.cpp' --include='*.h' 'include' . | grep 'Sample\.h'
или - лучше (учитывая, что порядок критериев поиска однозначен),
grep -r --include='*.cpp' --include='*.h' 'include.*Sample\.h' .