Grep, ignorar avisos


50

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

Durante o grep, quero incluir apenas 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 correspondentes, nada mais. Por favor, sugira como posso fazer isso?

No momento estou usando

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

Respostas:


56

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


Te ser mais específico find . 2>/dev/null | grep 404.htmlé o que um comando seria
— #

30

Mais diretamente do que filtrar 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.

-s, --no-messages: suprime mensagens de erro sobre arquivos inexistentes ou ilegíveis. Nota sobre portabilidade: diferente do GNU grep, o 7th Edition Unix grep não estava em conformidade com o POSIX, porque faltava -q e sua opção -s se comportava como a opção -q do GNU grep. O grep no estilo USG também não possuía -q, mas sua opção -s se comportava como o GNU grep. Os scripts de shell portáteis devem evitar -q e -s e redirecionar a saída padrão e de erro para / dev / null. (-s é especificado pelo POSIX.)


Acabei de instalar o 13.04 e estou recebendo os erros que não estava recebendo no 12.04. Será que algo mudou? Eu achei legal que o grep parasse de alertar sobre arquivos serem diretórios, já que na maioria dos casos eu simplesmente não ligo!
— Alexis Wilke

Desculpe, ainda estou em 12.10, então não posso confirmar isso.
— Sebastian vom Meer

5

Eu costumava receber uma tonelada de mensagens irritantes como esta:

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

O motivo é que o --directoriessinalizador é o padrão read. Eu mudei para recurse; se você não quiser que ele faça automaticamente uma pesquisa recursiva, use-o skip.

A maneira mais fácil de lidar com isso o tempo todo é configurá-lo em uma variável de ambiente. Em ~/.bash_profileou ~/.bashrcdependendo da sua distribuição:

export GREP_OPTIONS='--directories=recurse'

Agora, suprime automaticamente essas mensagens sempre que eu uso grep.

Outra opção é a --no-messagesbandeira, taquigrafia -s. Isso também livra as Is a directorymensagens, mas também suprime outras mensagens que podem ser mais úteis. Por exemplo, se você estiver fazendo uma pesquisa aninhada */*/*e não existir esse arquivo desse padrão, ele não informará isso.


boa explicação
— aldr 16/10

1

Uma abordagem alternativa, em vez de greprecursivamente, -ir seria permitir que o findcomando (que é recursivo por padrão) manipule as permissões com -readablesinalizador e caminho para excluir com -not -path "*.svn*"sinalizadores e depois passe o arquivo para grep. A exclusão de diretórios é feita via -type fpara encontrar apenas arquivos regulares.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 

0

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

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

Para remover as mensagens de erro de permissão, convém executar o mesmo comando com sudo:

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

Mas, eventualmente, se você deseja pesquisar pacotes instalados, consulte as várias opções: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.