Как найти в различных видах файлов

Я работаю над Приложением 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 результаты?
  • Любой поведение неправ. В этом случае кто-то знает, является ли это общая Ubuntu problem/Windows-10 проблема приложения Ubuntu/... и если какое-либо решение может ожидаться и когда?

Заранее спасибо

0
задан 15 May 2018 в 02:12

2 ответа

Однако я знаю наверняка, что-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
ответ дан 29 October 2019 в 08:04

С современным grep, Вам не нужно find вообще, например.

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

или - лучше (учитывая, что порядок критериев поиска однозначен),

grep -r --include='*.cpp' --include='*.h' 'include.*Sample\.h' .
2
ответ дан 29 October 2019 в 08:04

Другие вопросы по тегам:

Похожие вопросы: