Grep para isso e não que em um arquivo?

0

Como posso grep para arquivos em uma estrutura de diretório que tenha este texto

addDesignControlChangeNotification

mas faltam este texto

removeDesignControlChangeNotification

Obrigado!

Nota: quero dizer o diretório em que o script inicia e todos os subdiretórios.

    
por Dan Rosenstark 03.04.2013 / 20:51

3 respostas

1

Aqui está uma que é vagamente baseada na resposta de Rich Homolka, mas funciona em árvores de diretórios:

find . -type f  -exec grep -l addDesignControlChangeNotification {} \; | 
 while IFS= read -r file; do 
   grep -q removeDesignControlChangeNotification "$file" > /dev/null ; 
   [ $? -ne 0 ] && echo $file; 
 done

Todos os arquivos retornados conterão addDesignControlChangeNotification , mas não removeDesignControlChangeNotification .

EXPLICAÇÃO:

  • find . -type f -exec grep -l foo {} \; : Isso imprimirá todos os arquivos em qualquer subdiretório do diretório atual que contenha a string foo . O -l flag faz com que o grep imprima apenas os nomes dos arquivos correspondentes.

  • while read file : itera em cada arquivo encontrado acima, salvando seu nome na variável $file .

  • grep -q bar "$file" > /dev/null : este comando procura a string bar em cada um dos arquivos que continham foo .

  • [ $? -ne 0 ] && echo $file; : Se o valor de retorno ( $? ) do comando grep for 0 (ou seja, se a string não estiver no arquivo), imprima o nome do arquivo.

por 03.04.2013 / 22:21
2

isso deve funcionar:

FIRST=addDesignControlChangeNotification
SECOND=removeDesignControlChangeNotification
grep -l $FIRST * | while IFS= read -r FILE
do
    grep $SECOND "$FILE" &> /dev/null
    if [ $? -ne 0 ]
    then
        echo "File $FILE has $FIRST but not $SECOND"
    fi
done
    
por 03.04.2013 / 20:56
0

Um forro:

comm -2 -3 <(grep -rl addDesignControlChangeNotification     . | sort ) \
           <(grep -rl removeDesignControlChangeNotification  . | sort )

grep -r é um grep recursivo, <() é substituição de processo e comm mostra linhas que um par de arquivos (classificados) tem / não tem em comum. Neste caso, queremos apenas a saída da coluna 1: linhas no primeiro arquivo (onde "arquivo" é realmente a saída do grep) que não estão no segundo.

    
por 04.04.2013 / 10:19

Tags