Você pode usar o find:
find . -type f -name "$fileglob" -exec grep -q $word1 {} \; -not -exec grep -q $word2 {} \; -print
Como faço para ver recursivamente uma lista de arquivos que tem uma string e especificamente não tem outra string? Além disso, quero dizer olhando dentro dos arquivos, ao invés dos nomes dos arquivos.
Você pode usar o find:
find . -type f -name "$fileglob" -exec grep -q $word1 {} \; -not -exec grep -q $word2 {} \; -print
Supondo que você realmente quer uma string, não um regexp, então fgrep
, então:
fgrep -rl --null desired_string . | xargs -0 fgrep -lv undesired_string --
Recursivamente ( -r
) grep para desired_string
no diretório atual, imprimindo os nomes dos arquivos ( -l
) e utilizando os nomes de arquivos, invoque repetidamente fgrep (para não sobrecarregar o espaço para argumentos de linha de comando ao invocá-lo), com -v
invertendo o sentido da correspondência.
Isso usa --null
para usar um caractere ASCII NUL após cada nome de arquivo, em vez de uma nova linha, para que você possa manipular nomes de arquivos com espaços e similares; que se encaixa no -0
dado aos xargs. Dependendo da variante Unix (Linux, BSD, etc), pode haver uma pequena opção para --null
, mas isso é menos portável. Estritamente falando, --null
não é portátil, mas qualquer grep do sistema moderno (f) deve tê-lo.
O --
no final do segundo (f) grep pára (f) grep de procurar por opções nos parâmetros a seguir, portanto, mesmo que você tenha um nome de arquivo começando com -
, ele ainda será processado como um nome de arquivo.
Tags command-line grep unix