Gere o MD5sum para todos os arquivos em um diretório e, em seguida, escreva (filename) .md5 para cada arquivo contendo o arquivo MD5SUM

2

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?

    
por Matthew 06.11.2017 / 21:10

5 respostas

2
cd /path/to/files &&
for file in *; do
    if [[ -f "$file" ]]; then
        md5sum -- "$file" > "${file}.md5"
    fi
done
    
por 06.11.2017 / 21:13
2

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 {} +
    
por 06.11.2017 / 22:36
0

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
    
por 20.01.2018 / 19:15
-1
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

    
por 20.01.2018 / 15:34
-1
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.

    
por 01.02.2018 / 18:41

Tags