Como encontrar diferentes tipos de arquivos

0

Estou trabalhando em um aplicativo do Ubuntu Windows no meu PC Windows-10, o resultado de uname -a é o seguinte:

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

Estou fazendo algum desenvolvimento em C ++ e gostaria de saber quais arquivos de origem ( *.cpp ou *.h ) estão incluindo o arquivo Sample.h , então lancei o seguinte comando:

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

Isso parece não estar funcionando: apenas os arquivos *.h , contendo include e Sample.h na mesma linha, são fornecidos.

No entanto, tenho certeza de que a construção -o para encontrar tipos diferentes de arquivos está correta:

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

= > aqui eu recebo uma lista dos arquivos *.cpp e *.h .

Isso me deixa com duas possibilidades:

  • O comportamento está correto: o parâmetro -exec é usado apenas no último resultado find . Nesse caso, alguém pode me dizer como posso executar o -exec em todos os resultados find ?
  • O comportamento está errado. Nesse caso, alguém sabe se este é um problema geral do Ubuntu / problema com o Windows-10 no Ubuntu / ... e se alguma solução pode ser esperada e quando?

Obrigado antecipadamente

    
por Dominique 15.05.2018 / 11:08

2 respostas

2

However I know for sure that the -o construction for finding different kinds of files is correct:

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

Verdadeiro, mas a precedência de -or não é tão alta. De 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.

Então:

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

é como:

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

e não como:

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

Você precisa:

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

(Eu suponho que você usou /dev/null para fazer grep imprimir o nome do arquivo? A opção -H faz isso.)

    
por muru 15.05.2018 / 11:17
2

Com o grep moderno, você não precisa de find , por exemplo,

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

ou - melhor (dado que a ordem dos termos de pesquisa não é ambígua)

grep -r --include='*.cpp' --include='*.h' 'include.*Sample\.h' .
    
por steeldriver 15.05.2018 / 12:36