Como posso encontrar todos os arquivos que NÃO contêm uma string de texto?

34

Qual comando conciso pode ser usado para encontrar todos os arquivos que NÃO contêm uma string de texto?

Eu tentei isso (usando -v para inverter os parâmetros do grep) sem sorte:

find . -exec grep -v -l shared.php {} \;

Alguém disse que isso funcionaria:

find . ! -exec grep -l shared.php {} \;

Mas isso não parece funcionar para mim.

Esta página tem este exemplo :

find ./logs -size +1c  > t._tmp
while read filename
do
     grep -q "Process Complete" $filename
     if [ $? -ne 0 ] ; then
             echo $filename
     fi
done < t._tmp
rm -f t_tmp

Mas isso é complicado e nada conciso.

ps: Eu sei que grep -L * vai fazer isso, mas como eu posso usar o comando find em combinação com o grep para arquivos excluídos é o que eu realmente quero saber.

pss: Também não tenho certeza de como ter grep include subdirectories com a sintaxe grep -L * , mas eu ainda quero saber como usá-lo com find :)

    
por cwd 14.12.2011 / 15:26

5 respostas

7
find . -type f | xargs grep -H -c 'shared.php' | grep 0$ | cut -d':' -f1    

OR

find . -type f -exec grep -H -c 'shared.php' {} \; | grep 0$ | cut -d':' -f1

Aqui estamos calculando o número de linhas correspondentes (usando -c ) em um arquivo se a contagem for 0, então é o arquivo necessário, então cortamos a primeira coluna, ou seja, o nome do arquivo da saída.

    
por 14.12.2011 / 16:59
48

Sua localização deve funcionar se você alterar -v -l (arquivos com qualquer linha não correspondente) para -L (arquivos sem correspondência de linhas), mas você também pode usar a recursiva de grep ( -r ) opção:

grep -rL shared.php .
    
por 14.12.2011 / 15:43
4

I know that grep -L * will do this, but how can I use the find command in combination with grep to exclude files is what I really want to know

Você pode usar find e grep da seguinte forma:

find . -type f ! -exec grep -q 'PATTERN' {} \; -print

Aqui -print é executado apenas se a expressão anterior: ! -exec ... {} for avaliada como true .
Portanto, para cada arquivo encontrado, grep -q 'PATTERN' é exec uted, se o resultado for false , a expressão inteira ! -exec grep -q 'PATTERN' será avaliada como true e o nome do arquivo será print ed.

    
por 02.10.2015 / 01:12
1

Você não encontrou o resultado correspondente pela opção -L

grep -iL shared.php .
    
por 09.01.2015 / 07:59
-1

Acho que você está procurando um comando como

find . -type f -execdir grep -q -v shared.php {} \; -print

A opção -q faz grep sair e depois de usar -execdir você precisa de -print para imprimir os arquivos encontrados.

    
por 05.04.2013 / 13:32