Script para encontrar arquivos com uma extensão específica, mas NÃO contendo texto específico [closed]

3

Eu estou tentando escrever um script que basicamente procura recursivamente usando find (ou outro método) para encontrar todos os arquivos que terminam com * .p ou * .w, mas não contém sysvars.i ou preprocess.i

É o melhor comando para usar?

    
por colin 01.08.2011 / 13:24

2 respostas

4

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 para grep .
  • \( [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 comando find . A função -exec é preferível a usar xargs 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.
por 01.08.2011 / 13:34
-1

É possível criar expressões booleanas complexas de testes de localização:

find . \( -name '*.p' -or -name '*.w' \) -and \
  -not \( -name 'sysvars.i' -or -name 'preprocess.i' \)

Os nomes de opções compatíveis com Posix são -a , -o e ! em vez de -and , -or e -not .

Se você precisar procurar por strings dentro do conteúdo dos arquivos, use find juntamente com grep (por exemplo).

    
por 01.08.2011 / 13:33

Tags