Simples (?) Comando Unix Grep

3

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.

    
por Matrym 14.02.2011 / 07:27

2 respostas

2

Você pode usar o find:

find . -type f -name "$fileglob" -exec grep -q $word1 {} \; -not -exec grep -q $word2 {} \; -print
    
por 14.02.2011 / 08:01
0

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.

    
por 25.10.2013 / 12:31