Você pode conseguir isso com um bom ninja-fu bash. :)
Você conhece o procedimento para calcular um de cada vez:
$ echo abc | md5sum
0bee89b07a248e27c83fc3d5951213c1 -
$ echo abc | sha1sum
03cfd743661f07975fa2f1220c5194cbaff48451 -
Edit: como @gertvdijk sugerido, e lendo as páginas de informações um pouco mais, isso pode ser feito diretamente com tee e Substituição de Processos suportados por shells modernos, sem redirecionamentos. Desta forma você pode passar seus dados para dois processos e um arquivo usando tee:
$ echo abc | tee >(md5sum) >(sha1sum) > output.txt
Também é possível encadear se você precisar de mais, mas você precisa cuidar do STDOUT de todos os subprocessos. Isto NÃO lhe dará o resultado esperado, mas mistura as duas primeiras somas de verificação juntamente com os dados em output.txt:
$ echo abc | tee >(md5sum) >(sha1sum) | tee >(sha256sum) >(sha512sum) > output.txt
Se você redirecionar as somas de verificação para um arquivo dentro dos processos substituídos, você poderá encadear essas que você quiser:
$ echo abc | tee >(md5sum > /tmp/md5.txt) >(sha1sum > /tmp/sha1.txt) | tee >(sha256sum > /tmp/sha256.txt) >(sha512sum > /tmp/sha512.txt) > output.txt
Esta é a minha sugestão inicial sem substituição de processo, mas que permite o uso encadeamento / recursivo sem misturar os dados e a saída:
$ echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
0bee89b07a248e27c83fc3d5951213c1 -
03cfd743661f07975fa2f1220c5194cbaff48451 -
O truque aqui é usar tee
, que duplica os dados para STDOUT e um arquivo. Estamos sendo espertos ao dizer para gravar os dados no arquivo / proc / self / fd / 2, que sempre é o descritor de arquivo STDERR do processo atual. E com a sintaxe > >(program)
, podemos redirecionar cada descritor de arquivo para STDIN de um programa em vez de um arquivo. Apenas como |
, mas com mais controle. > >(md5sum)
redireciona STDOUT para o programa md5sum
, enquanto 2> >(sha1sum)
redireciona STDERR para o programa sha1sum
.
Observe que a ordem de 2>
e >
parece ser importante, mas preciso colocar 2>
primeiro na linha de comando. Estes são avaliados da direita para a esquerda, mas não sei por que isso faz diferença.
Para fazer isso em um arquivo ou disco rígido, você deve substituir "echo abc" por um gato ou um dd, por exemplo:
dd if=/dev/sda bs=8k | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum)
O mais bacana disso é que você pode realmente reciclar e executar vários ao mesmo tempo, não apenas dois. A sintaxe fica peluda, mas isso funciona:
echo abc | tee -a /proc/self/fd/2 2> >(tee -a /proc/self/fd/2 2> >(sha256sum) > >(sha384sum) ) > >(sha512sum)
Se você deseja capturar o resultado e usá-lo em um script, isso também funciona:
A=$(echo abc | tee -a /proc/self/fd/2 2> >(sha1sum) > >(md5sum))
Agora, $A
é uma string contendo toda a saída, incluindo novas linhas. Você pode analisar os valores mais tarde também:
echo "checksum=[$(echo "$A" | head -1 | cut -d " " -f 1)]"
Não tenho certeza se você tem alguma garantia sobre o pedido de saída.