Eu usei md5sum
para pv
verificar 4 GiB de arquivos que estão no mesmo diretório:
md5sum dir/* | pv -s 4g | sort
O comando é concluÃdo com sucesso em cerca de 28 segundos, mas pv
a saÃda de 's está toda errada. Este é o tipo de saÃda que é exibida por toda parte:
219 B 0:00:07 [ 125 B/s ] [> ] 0% ETA 1668:01:09:02
É assim sem o -s 4g
e | sort
também. Eu também tentei com arquivos diferentes.
Eu tentei usar pv
com cat
e a saÃda foi boa, então o problema parece ser causado por md5sum
.
O
pv
utilitário é "fantasiosocat
", o que significa que você pode usarpv
na maioria das situações em que usariacat
.Usando
cat
commd5sum
, você pode calcular a soma de verificação MD5 de um único arquivo comou, com
pv
,Infelizmente, porém, isso não permite
md5sum
inserir o nome do arquivo em sua saÃda corretamente.Agora, felizmente,
pv
é um , e em algunscat
sistemas (Linux), é capaz de observar os dados sendo passados ​​por outro processo. Isso é feito usando sua-d
opção com o ID do processo desse outro processo.Isso significa que você pode fazer coisas como
Isso permitiria
pv
observar omd5sum
processo. Osleep
está lá para permitirmd5sum
que o , que está sendo executado em segundo plano, seja iniciado corretamente.pgrep -n md5sum
retornaria o PID domd5sum
processo iniciado mais recentemente que você possui.pv
sairá assim que o processo que está sendo observado terminar.Eu testei essa maneira especÃfica de execução
pv
algumas vezes e geralmente parece funcionar bem, mas às vezes parece parar de produzir qualquer coisa comomd5sum
alterna para o próximo arquivo. Às vezes, parece gerar tarefas espúrias em segundo plano no shell.Provavelmente seria mais seguro executá-lo como
A
-W
opção fará compv
que espere até que haja dados reais sendo transferidos, embora isso também nem sempre pareça funcionar de maneira confiável.Os dados que você está alimentando pelo pipe não são os dados dos arquivos que
md5sum
estão sendo processados, mas sim amd5sum
saÃda, que, para cada arquivo, consiste em uma linha composta por: o MD5-hash, dois espaços e o nome do arquivo. Como sabemos disso com antecedência, podemos informarpv
adequadamente, de modo a permitir que ele exiba um indicador de progresso preciso. Existem duas maneiras de fazê-lo.O primeiro método preferido (sugerido por frostschutz) faz uso do fato de
md5sum
gerar uma linha por arquivo processado e do fato depv
possuir um modo de linha que conta linhas em vez de bytes. Neste modopv
só irá mover a barra de progresso quando encontrar uma nova linha no throughput, ou seja, por arquivo finalizado pormd5sum
. No Bash, esse primeiro método pode ficar assim:O
set
builtin é usado para definir os parâmetros posicionais para os arquivos a serem processados ​​(o*.iso
padrão de shell é expandido pelo shell).md5sum
é então instruÃdo a processar esses arquivos ($@
se expande para os parâmetros posicionais) e,pv
no modo de linha, moverá o indicador de progresso toda vez que um arquivo for processado / uma linha for gerada pormd5sum
. Notavelmente,pv
é informado do número total de linhas que pode esperar (-s $#
), pois o parâmetro especial do shell$#
se expande para o número de argumentos posicionais.O segundo método não é baseado em linha, mas em byte. Com
md5sum
isso desnecessariamente complicado, mas algum outro programa pode não produzir linhas, mas, por exemplo, dados contÃnuos, e essa abordagem pode ser mais prática. Eu ilustro commd5sum
embora. A ideia é calcular a quantidade de dados quemd5sum
(ou algum outro programa) vai produzir, e usar isso para informarpv
. No Bash, isso pode ter a seguinte aparência:A primeira linha calcula a estimativa do tamanho de saÃda (
os
): o primeiro termo é o número de bytes necessários para codificar os nomes dos arquivos (incluindo nova linha), o segundo termo o número de bytes usados ​​para codificar os hashes MD5 (32 bytes cada), mais 2 vagas. Na segunda linha, informamospv
que a quantidade de dados esperada éos
bytes, para que possa mostrar um indicador de progresso preciso até 100% (qual indicador é atualizado por arquivo md5summed finalizado).Obviamente, ambos os métodos são práticos apenas no caso de vários arquivos serem processados. Além disso, deve-se notar que, uma vez que a saÃda de
md5sum
não está relacionada à quantidade de tempo que omd5sum
programa tem que gastar processando os dados subjacentes, o indicador de progresso pode ser considerado um tanto enganoso. Por exemplo, no segundo método, o arquivo com o nome mais curto produzirá a atualização de progresso mais baixa, mesmo que possa ser o maior em tamanho. Então, novamente, se todos os arquivos tiverem tamanhos e nomes semelhantes, isso não deve importar muito.Aqui está um truque sujo para obter progresso por arquivo:
O que isso parece:
Agora, isso faz várias suposições. Em primeiro lugar, essa leitura de dados é mais lenta do que o hash.
pv
Em segundo lugar, esse sistema operacional armazenará em cache a E/S para que os dados não sejam (fisicamente) lidos duas vezes , emboramd5sum
sejam leitores completamente independentes.O bom de um hack tão sujo e sujo é que você pode adaptá-lo facilmente para fazer uma barra de progresso em todos os dados, não apenas em um arquivo. E ainda fazer coisas estranhas como classificar a saÃda depois.
Como é (em andamento):
Como é (acabado):
Agora, isso é para os hacks. Verifique outras respostas para soluções adequadas. ;-)
Como já apontado nos comentários e outras respostas:
pv
apenasmd5sum
a saÃda de: checksums e nomes de arquivos; assim,pv
a barra de progresso do 's não é capaz de mostrar quantos dadosmd5sum
estão sendo lidos.pv
o tamanho do(s) arquivo(s) que você está canalizando (manualmente, com-s
) é inconveniente.Encaminhar o conteúdo de seus arquivos
pv
e, em seguidamd5sum
, fornecerá uma barra de progresso, mas os nomes dos arquivos serão perdidos.Este código é uma maneira não tão elegante de ter ambos - uma barra de progresso significativa e nomes de arquivos com somas de verificação:
O script deve ser invocado como:
É claro que você pode declará-lo como uma função, para evitar ter que digitar seu caminho para chamá-lo (ou adicioná-lo ao seu
PATH
):Dessa forma, o comando
pvsum dir/* | sort
será equivalente ao seumd5sum dir/* | pv -s <size> | sort
.Sua saÃda:
O que faz:
pv
paramd5sum
, mostrando a barra de progresso padrão.sed
é usado para remover o-
impresso pormd5sum
(que está lendo da entrada padrão); isso também tenta tornar a saÃda adequada para ser consumida pormd5sum -c
(graças a frostschutz por apontar isso) 1 .Sobre
sort
:Não tenho certeza sobre seus resultados esperados, então simplesmente ignorei. Como
pv
grava sua barra de progresso no erro padrão, canalizar tudo parasort
desanexarpv
a saÃda demd5sum
's da saÃda de .De qualquer forma, você pode simplesmente anexar
| sort
depoisdone
no código acima e verificar se o resultado está bom para você.1 Observe que a saÃda do código mostrado acima não será adequada
md5sum -c
se os nomes dos arquivos incluÃrem novas linhas. Manipular novas linhas é possÃvel, mas algumas versões demd5sum
se comportam de maneira diferente a esse respeito (veja, por exemplo, respostas a esta pergunta ), tornando uma solução geral não fácil (e fora do escopo desta resposta).Assumindo uma versão recente do
md5sum
, uma tentativa de resolver esse problema pode ser:Onde a única adição, a final
sed
, irá:H
acrescenta uma nova linha e um espaço de padrão atual ao espaço de espera;1h
substitui anteriorH
, apenas para a primeira linha, fazendo o mesmo, mas sem acrescentar uma nova linha;$!d
inicia um novo ciclo se a linha atual não for a última;g
coloca o conteúdo do espaço de espera no espaço do padrão.\
) qualquer barra invertida no espaço de padrão resultante.\n
qualquer nova linha no espaço de padrão resultante.t x
: branch to labelx
), uma barra invertida será adicionada no inÃcio da soma de verificação para sinalizarmd5sum -c
que algo não deve ser escapado; caso contrário, simplesmente desista. Em ambos os casos, imprima (p
) o espaço do padrão na saÃda padrão antes de sair (a opção-n
desativa a impressão automática).Eu também gostei de domar o 'gato chique',
pv
, paramd5sum
:-)usage
saÃda, se você não inserir o padrão corretamente.".* *"
... OK
pv
permanecerá na {tela/janela do terminal}pv
processos em um loop for, um global e um para cada arquivo, o globalpv
'só conta os arquivos', e o outro mede a velocidade e a quantidade de dados transferidosEu uso o name
md5summer
, faço o shellscript executável e coloco em um diretório em PATH (meu~/bin
diretório, você pode preferir/usr/local/bin
).Exemplo de demonstração
Uso
Eu testei neste diretório
Uso normal mais padrão para ver arquivos ocultos
SaÃda detalhada mais padrão para ver arquivos ocultos
Redirecionamento para um arquivo, primeiro a saÃda da tela
e, em seguida, a saÃda salva
Verificando arquivos iso