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/path
retorna 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 f
retorna 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 usarxargs
ou 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.
-