usando grep com pipe e e comercial para filtrar erros de find

16

Estou usando o cygwin para encontrar um arquivo no cygdrive.

No entanto, preciso suprimir as mensagens de permissão negada (caso contrário, os resultados ficam ocultos nas mensagens de erro). O seguinte comando funciona:

find -name 'myfile.*' |& grep -v "Permission denied"

Eu não entendo por que o e comercial precisa ser colocado nesse comando, teria esperado que isso funcionasse, mas não.

find -name 'myfile.*' | grep -v "Permission denied"

Por favor, explique o significado do e comercial.

    
por HKK 05.02.2011 / 20:25

3 respostas

16

Em sistemas semelhantes ao Unix, existem dois caminhos de saída que, se não forem modificados, enviarão a saída para sua tela. Erro padrão (ou stderr) é aquele que captura a maioria das falhas e condições de erro.

Para passar a mensagem de permissão negada no stderr para o mesmo fluxo de saída como "saída regular", você deve combinar os dois. No seu exemplo, para que o grep -v funcione corretamente, você combina stdout (saída padrão) e stderr com a sintaxe arcana que você vê.

De manual do GNU Bash seção 3.2.2 Oleodutos :

  

Se " |& " for usado, o erro padrão de comando1 , além de seu   saída padrão, está conectada à entrada padrão do comando2   o cano; é uma abreviação de 2>&1 | . Este redirecionamento implícito de   o erro padrão para a saída padrão é executado após qualquer   redirecionamentos especificados pelo comando.

Além disso, como o geirha aponta, se você quiser apenas se livrar da saída do stderr, você deve fazer algo como

find -name 'myfile.*' 2> /dev/null

ou talvez

find -name 'myfile.*' 2> /tmp/errorlog

E observe que, se você tiver sequências de comandos, como find passando sua saída para xargs , precisará colocar o pipeline inteiro de comandos entre parênteses para capturar a saída de todos os componentes do comando. Por exemplo,

(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 )  2> /dev/null

Se você deixou de fora os parênteses e fez isso em vez disso -

find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null

você ainda veria a permissão negada erros no find ou no egrep, mas o stderr seria redirecionado para xargs.

Como você viu, você provavelmente jogaria fora o stderr somente depois de ver seu conteúdo durante um teste.

Note que com o GNU find e, até onde eu sei, qualquer find compatível com POSIX, a opção -print é implícita. Você ainda pode fornecê-lo explicitamente, se quiser.

    
por belacqua 05.02.2011 / 20:34
6

As mensagens de erro são gravadas em stderr , não stdout , mas | canaliza apenas stdout .

Você provavelmente deseja |& , quais canais stderr também como stdout .

    
por Florian Diesch 05.02.2011 / 20:37
1

Se você deseja ignorar as mensagens de erro, apenas redirecione stderr para / dev / null.

find . -name 'myfile.*' -print 2>/dev/null

Além disso, considere a leitura do link .

    
por geirha 06.02.2011 / 03:38