Grep, ignore os avisos

40

Estou tentando encontrar o diretório de instalação de um pacote específico. Eu tenho uma determinada palavra-chave usando o qual estou tentando encontrar um arquivo específico.

Durante o grep, eu só quero incluir o tipo de arquivo cpp ou h . Eu não quero que o grep mostre avisos como Permissão negada ou Não foi possível encontrar o diretório . Eu só quero que ele exiba arquivos combinados, nada mais. Por favor, sugira como posso fazer isso?

Atualmente estou usando

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./
    
por Neeraj Gupta 26.03.2011 / 15:22

5 respostas

47

Esses avisos são direcionados para o fluxo stderr , em oposição ao descritor de arquivo out padrão. Você pode silenciar a saída do stderr adicionando 2>/dev/null ao final do seu comando.

    
por James Henstridge 26.03.2011 / 15:26
22

Mais diretamente do que filtrando os avisos, você pode desativá-los adicionando -s :

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Existem alguns problemas de compatibilidade com esta opção. No entanto, isso não deve ser um problema para uso pessoal.

% bl0ck_qu0te%     
por Sebastian vom Meer 25.05.2013 / 16:15
4

Eu costumava receber uma tonelada de mensagens irritantes assim:

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

O motivo é que o --directories flag é padronizado como read . Eu mudei para recurse ; Se você não quiser fazer automaticamente uma pesquisa recursiva, use skip .

A maneira mais fácil de lidar com isso o tempo todo é configurá-lo em uma variável de ambiente. Em ~/.bash_profile ou ~/.bashrc dependendo da sua distro:

export GREP_OPTIONS='--directories=recurse'

Agora ele automaticamente suprime essas mensagens sempre que eu uso o grep.

Outra opção é o --no-messages flag, taquigrafia -s . Isso também eliminará as mensagens Is a directory , mas também suprimirá outras mensagens que podem ser mais úteis. Por exemplo, se você estiver fazendo uma pesquisa aninhada em */*/* e nenhum arquivo desse padrão existir, isso não será informado.

    
por andrewtweber 02.10.2015 / 23:28
0

Ao fazer pesquisas recursivas em arquivos específicos, é muito melhor usar ack-grep . A sintaxe aqui seria:

ack-grep -i "My term" --cpp --h

Para remover as mensagens de erro de permissão, você pode querer executar o mesmo comando com sudo :

ack-grep -i "My term" --cpp --h

Mas, se quiser pesquisar pacotes instalados, veja as várias opções: link

    
por dargaud 25.07.2014 / 17:12
0

Uma abordagem alternativa em vez de fazer grep recursivamente com -ir seria permitir que o comando find (que é recursivo por padrão) manipule as permissões com -readable sinalizador e caminho para excluir com -not -path "*.svn*" sinalizadores e em seguida, passe o arquivo para grep . A exclusão de diretórios é feita via -type f para localizar apenas arquivos regulares.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 
    
por Sergiy Kolodyazhnyy 05.02.2017 / 19:10

Tags