Você pode combinar as ações de find e grep para realizar isso:
find /search/path/ -type f \( -name '*.p' -or -name '*.w' \) \
-exec grep -L -e 'sysvars.i' -e 'preprocess.i' {} +
Vamos quebrar isso.
-
find /serch/pathretorna todos os arquivos no caminho especificado. Em seguida, precisamos reduzi-lo, começando com as coisas que eliminarão a maioria das combinações primeiro para economizar tempo e verificar as outras coisas mais tarde. -
-type fretorna apenas arquivos. Se você tiver diretórios correspondentes ao padrão do nome do arquivo, não queremos enviá-los paragrep. -
\( [expr1] -or [expr2] \)cria uma correspondência de / ou para que localize os arquivos de retorno que são do tipo "expr1" ou "expr2", mas não há motivo para que eles correspondam a ambos. Os parênteses ajudam a separar esse grupo ou do restante das opções de correspondência que são, na verdade, os requisitos e . -
-name '*.p'e-name '*.w'são bastante óbvios, retornando arquivos correspondentes a esses padrões de nome. -
-exec command {} +executará o comando especificado e quaisquer argumentos com o bit{}serão substituídos por argumentos para cada arquivo correspondido pelo restante do comandofind. A função-execé preferível a usarxargsou canalizar para um loop porque ele trata problemas de citação e nomes de arquivos tão bem. -
grepé usado para procurar um padrão nos arquivos especificados.-
-Lé usado para retornar apenas uma lista de nomes de arquivos que não têm correspondências -
-e 'PATTERN'é especificado duas vezes para listar as duas sequências de pesquisa que você não deseja corresponder.
-