Estou fazendo grepping através de uma grande pilha de código gerenciado pelo git, e sempre que faço um grep, vejo pilhas e pilhas de mensagens do formulário:
> grep pattern * -R -n
whatever/.git/svn: No such file or directory
Existe alguma maneira de fazer essas linhas desaparecerem?
ag
,ack
ou, emcgrep
vez disso - eles são muito mais rápidos / melhores do quegrep
para pesquisar repositórios de código.No such file or directory
mensagens para arquivos e / ou diretórios existentes? Ou, inversamente, comogrep *
obter nomes de arquivos que não existem? Essa é uma condição de corrida, em que algum outro processo manipula a árvore de diretórios (criação, renomeação e exclusão de arquivos) enquanto elagrep
está em execução?Respostas:
Você pode usar o sinalizador
-s
ou--no-messages
para suprimir erros.fonte
/bin/ls -1 | xargs grep 'some text'
fornecerá "esse arquivo ou diretório", porque ele divide 'a b.txt' em 2 args. Se você suprimir, não notará que perdeu um arquivo.find
e usarprint0
comxargs -0
Isso resolve o problema? ObrigadoSe você está procurando através de um repositório git, eu recomendo que você use
git grep
. Você não precisa passar-R
ou o caminho.Isso mostrará todas as correspondências do seu diretório atual para baixo.
fonte
Ggrep
também pesquisa a partir da parte superior do diretório Git, em vez do diretório atual.Erros como esse geralmente são enviados para o fluxo de "erro padrão", que você pode canalizar para um arquivo ou simplesmente desaparecer na maioria dos comandos:
fonte
Eu já vi isso acontecer várias vezes, com links quebrados (links simbólicos que apontam para arquivos que não existem), o grep tenta pesquisar no arquivo de destino, que não existe (daí a mensagem de erro correta e precisa).
Normalmente, eu não me incomodo ao executar tarefas sysadmin no console, mas, a partir dos scripts, procuro arquivos de texto com "find" e depois grep cada um:
Ao invés de:
fonte
Normalmente, não deixo o grep fazer a recursão em si. Geralmente, existem alguns diretórios que você deseja pular (.git, .svn ...)
Você pode fazer aliases inteligentes com posturas como essa:
Pode parecer um exagero à primeira vista, mas quando você precisa filtrar alguns padrões, é bastante útil.
fonte
-exec
antes do seu grep.\( -name .svn -o -name .git \)
Você já tentou a
-0
opção em xargs ? Algo assim:fonte
find -print0 | xargs -0 grep 'text'
Use
-I
em grep.Exemplo:
grep SEARCH_ME -Irs ~/logs
.fonte
-I
pula arquivos binários - é equivalente a--binary-files=without-match
. Ele não suprime as mensagens "Não existe esse arquivo ou diretório".I redirecionar
stderr
parastdout
e, em seguida, inverter-match uso de grep (-v
) para excluir a string de aviso / erro que eu quero esconder:fonte