cd /path/to/files &&
for file in *; do
if [[ -f "$file" ]]; then
md5sum -- "$file" > "${file}.md5"
fi
done
Eu tenho um diretório cheio de arquivos. Cada arquivo será copiado para um tipo específico de host de destino.
Eu quero calcular uma soma MD5 para cada arquivo no diretório e armazenar essa soma md5 em um arquivo que corresponda ao nome do arquivo que gerou a soma, mas com .md5 anexado.
Então, por exemplo, se eu tiver um diretório com:
a.bin
b.bin
c.bin
O resultado final deve ser:
a.bin
a.bin.md5 # a.bin's calculated checksum
b.bin
b.bin.md5 # b.bin's calculated checksum
c.bin
c.bin.md5 # c.bin's calculated checksum
Eu tentei isso com find exec e com xargs.
Com o find, eu tentei este comando:
find . -type f -exec md5sum {} + > {}.md5
Usando xargs, tentei este comando:
find . -type f | xargs -I {} md5sum {} > {}.md5
Em ambos os casos, acabo com um arquivo chamado {} .txt, que não é exatamente o que estou procurando.
Alguém poderia apontar como ajustá-los para gerar os arquivos md5 que estou procurando gerar?
O redirecionamento é um operador do shell.
Em:
find some args > {}.md5
find
é executado com alguns args e seu stdout é redirecionado para {}.md5
.
Aqui, você precisaria de find
para iniciar um shell para executar um redirecionamento para cada arquivo:
find . -type f -exec sh -c '
for file do
md5sum "$file" > "$file.md5"
done' sh {} +
Se você quiser evitar o componente de diretório na parte .md5
, você pode usar as alternativas -execdir
suportadas por muitas implementações de find
(embora com algumas você ainda obterá um componente de diretório ./
, e com alguns, isso ainda vai rodar um shell por arquivo mesmo com {} +
:
find . -type f -execdir sh -c '
for file do
md5sum "$file" > "$file.md5"
done' sh {} +
Ou você pode fazer isso como:
find . -type f -exec sh -c '
for file do
(cd "${file%/*" && exec md5sum -- "${file##*/}") > "$file.md5"
done' sh {} +
Eu sei que há efeitos colaterais em piping em um loop while, mas eu gosto da simplicidade, legibilidade e extensibilidade desta solução
find . -type f ! -name \*.md5 |\
while read a; do md5sum $a > $a.md5; done
Para usar este scipplet para verificar as somas simplesmente:
find . -type f ! -name \*.md5 |\
while read a; do echo $a; md5sum -c $a.md5; done
find . -name '*.iso' -type f -exec sh -c "ls -lh {}; pv {} | md5sum > {}.md5" \;
opcional
ls -lh {};
para mostrar o arquivo de processamento e
pv {}
para mostrar a barra de progresso no arquivo iso grande (lento) no meu caso
cd /path/to/files && ls -1| xargs md5sum | xargs -l bash -c 'echo $0" "$1 > $1.md5'
primeiro o xargs gera, o segundo xargs pega e salva em .md5
Se você precisar de patter de arquivo de filtro, você pode substituir ls por find ou adicionar grep posteriormente.