Gerar soma de verificação md5 para todos os arquivos em um diretório

61

Eu gostaria de criar uma lista de soma de verificação md5 para todos os arquivos em um diretório.

Eu quero cat filename | md5sum > ouptput.txt . Eu quero fazer isso em 1 passo para todos os arquivos no meu diretório.

Qualquer assistência seria ótima.

    
por Walter Wayne Leutwyler 10.07.2013 / 16:24

3 respostas

93

Você pode passar md5sum de vários nomes de arquivos ou expansões de bash:

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

Se você quiser se divertir, pode usar coisas como find para pesquisar e filtrar os arquivos, além de trabalhar recursivamente:

find -type f -exec md5sum "{}" + > checklist.chk
    
por Oli 10.07.2013 / 16:28
10

Um ótimo programa de verificação / criação de checksum é o rhash. Cria arquivos compatíveis com SFV e os verifica também.

Ele suporta md4, md5, sha1, sha512, crc32 e muitos outros.

Além disso, ele pode criar criações recursivas (opção -r) como md5deep ou sha1deep.

Por último, mas não menos importante, você pode formatar a saída do arquivo de soma de verificação; por exemplo:

rhash --md5 -p '%h,%p\n' -r /home/

exibe um arquivo CSV incluindo o caminho completo dos arquivos recursivamente, começando com o diretório /home .

Acho extremamente útil até mesmo a opção -e renomear os arquivos inserindo a soma crc32 no nome.

Você pode alterar "md5sum" com "rhash" nos exemplos do PhoenixNL72.

    
por Marcolino 27.05.2014 / 11:34
6

Aqui estão dois exemplos mais extensos:

  1. Crie um arquivo md5 em cada diretório que ainda não tenha um, com caminhos absolutos:

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
    
  2. Crie um arquivo md5 em cada pasta que ainda não tenha um: nenhum caminho, apenas nomes de arquivos:

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 
    

O que difere entre 1 e 2 é a maneira como os arquivos são apresentados no arquivo md5 resultante.

Os comandos fazem o seguinte:

  1. Crie uma lista de nomes de diretório para a pasta atual. (Árvore)
  2. Classifique a lista de pastas.
  3. Verifique em cada diretório se o arquivo @ md5sum.md5 existe. Saída pulada se existir, saída Processando se não existir.
  4. Se o arquivo @ md5Sum.md5 não existir, md5Sum gerará um com as somas de verificação de todos os arquivos na pasta. 5) Configure o arquivo @ md5Sum.md5 gerado para somente leitura.

A saída deste script inteiro pode ser redirecionada para um arquivo (.....; feito > test.log) ou canalizado para outro programa (como o grep). A saída informará apenas quais diretórios foram ignorados e quais foram processados.

Após uma execução bem-sucedida, você terminará com um arquivo @ md5Sum.md5 em cada subdiretório do diretório atual

Eu nomeei o arquivo @ md5Sum.md5 para que ele seja listado na parte superior do diretório em um compartilhamento de samba.

A verificação de todos os arquivos @ md5Sum.md5 pode ser feita pelos próximos comandos:

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

Em seguida, você pode grep checklog.txt usando grep -v OK para obter uma lista de todos os arquivos que diferem.

Para regenerar um @ md5Sum.md5 em um diretório específico, quando você alterou ou adicionou arquivos, por exemplo, exclua o arquivo @ md5Sum.md5 ou renomeie-o e execute o comando generate novamente.

    
por PhoenixNL72 31.07.2013 / 19:00