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.
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} ./
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.
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%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.
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
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" "{}" \;