Como se livrar da mensagem “blocos” dada pelo cpio?

1

Estou tentando analisar isso: Como obtenho a soma MD5 do conteúdo de um diretório como uma soma? , e estou tentando:

$ find | LC_ALL=C sort | cpio -o | md5sum
25324 blocks
6631718c8856606639a4c9b1ef24d420  -

Hmm ... Eu gostaria apenas do hash, nada mais na saída ... supondo que "25324 blocos" foi impresso para stderr, tento redirecionar stderr para /dev/null :

$ find | LC_ALL=C sort | cpio -o | md5sum 2>/dev/null 
25324 blocks
6631718c8856606639a4c9b1ef24d420  -

Não, não é isso. Vamos apenas pelo teste, tente redirecionar o stdout para /dev/null :

$ find | LC_ALL=C sort | cpio -o | md5sum 1>/dev/null 
25324 blocks

Ok, o hash desapareceu como esperado - mas a mensagem "blocos" ainda está lá ?! Onde diabos é este "25324 blocos" impresso, via descritor de arquivo 3?!:

$ find | LC_ALL=C sort | cpio -o | md5sum 3>/dev/null 
25324 blocks
6631718c8856606639a4c9b1ef24d420  -

Não, não é isso ... De qualquer forma, eu posso pegar apenas o hash com o awk:

$ find | LC_ALL=C sort | cpio -o | md5sum | awk '{print $1}'
25324 blocks
6631718c8856606639a4c9b1ef24d420

mas ainda assim a maldita mensagem "blocos" é impressa ... Então, como ela é impressa no terminal (como parece não ser impressa via stdout ou stderr), e como posso suprimir essa mensagem?

EDIT: encontrou a resposta, a mensagem "blocos" é impressa por cpio , então a coisa certa a fazer é:

$ find | LC_ALL=C sort | cpio -o 2>/dev/null | md5sum | awk '{print $1}'
6631718c8856606639a4c9b1ef24d420

Agora temos apenas o hash ...

    
por sdaau 02.09.2016 / 07:28

2 respostas

4

A mensagem é impressa por cpio , isso evita:

find | LC_ALL=C sort | cpio -o 2> /dev/null | md5sum | awk '{print $1}'

Você perderá todas as mensagens de erro impressas por cpio se você usar essa abordagem. Algumas versões de cpio (pelo menos GNU e FreeBSD) suportam uma opção quiet :

find | LC_ALL=C sort | cpio -o --quiet | md5sum | awk '{print $1}'

Para evitar a perda de erros com uma versão de cpio que não suporta --quiet , você pode registrá-los em um arquivo temporário:

cpiolog=$(mktemp); find | LC_ALL=C sort | cpio -o 2> "${cpiolog}" | md5sum | awk '{print $1}'; grep -v blocks "${cpiolog}"; rm -f "${cpiolog}"
    
por 02.09.2016 / 07:33
2

Esta mensagem é impressa por cpio . Com o GNU cpio ou o FreeBSD cpio, passe a opção --quiet para suprimi-lo.

Ou opte pelo cpio e use a pax padrão ou o tar mais comum.

    
por 02.09.2016 / 23:51