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

75

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 uma etapa para todos os arquivos no meu diretório.

Qualquer apoio seria bom.

Walter Wayne Leutwyler
fonte
Como posso encontrar o md5sum (soma de verificação) de um arquivo de backup específico? -Como deve ser o meu script -qual é o comando para ele #

Respostas:

110

Você pode passar md5sumvá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 finddrill down e filtrar os arquivos, além de trabalhar recursivamente:

find -type f -exec md5sum "{}" + > checklist.chk
Oli
fonte
1
♦ como usar o acima para obter md5sumos arquivos dentro sub-diretórios, o acima md5sum *emissor de entrar em nível de subdiretório dizendo ... é um diretório
Kasun Siyambalapitiya
Desculpe por perguntar, executando find -type f -exec md5sum '{}' +e `find -type f -exec md5sum '{}' 'eu consegui obtê-lo. Obrigado :)
Kasun Siyambalapitiya
Eu prefiro o visual desta saída mais: #openssl md5 * > checklist.txt
2123 ashley
1
Se você estiver usando um shell que possa avaliar **recursivamente (como o zsh), é ainda mais simples:md5sum **/* 2>/dev/null
Joost
12

Um ótimo programa de criação / verificação de soma de verificação é o rhash. Ele cria até 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ção recursiva (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/

gera um arquivo CSV, incluindo o caminho completo dos arquivos, iniciando recursivamente com o /homediretório

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

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

Marcolino
fonte
1
O que exatamente '/ home /' faz aqui? Essa ferramenta parece muito boa.
Andy Ibanez
Eu acho que é um erro, certamente erros para mim. -P é o formato para a saída. Eu vou corrigir isso.
Pbhj
7

Aqui estão dois exemplos mais abrangentes:

  1. Crie um arquivo md5 em cada diretório que ainda não possua 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 possua um: sem caminhos, 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 ignorada, se existir, processando saída, se não existir.
  4. Se o arquivo @ md5Sum.md5 não existir, o md5Sum gerará um com as somas de verificação de todos os arquivos na pasta. 5) Defina o arquivo @ md5Sum.md5 gerado como somente leitura.

A saída desse script inteiro pode ser redirecionada para um arquivo (.....; done> test.log) ou canalizada para outro programa (como 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

Chamei o arquivo de @ 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 seguintes comandos:

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

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

Para gerar novamente 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.

PhoenixNL72
fonte
O comando nº 1 usando caminhos completos: md5sum "$ {dir}" / * não está capturando arquivos ocultos começando com ponto. Algum remédio?
user14654
Tarde para a festa, mas como o md5sum deseja nomes de arquivos (parece infeliz se você fornecer um diretório), pode ser mais fácil pedir ajuda para encontrar ajuda: $ md5sum $ (encontre "$ dir" -maxdepth 0 -type f) O "- type f "extrai arquivos regulares e .hidden (também, o find tem muitas opções, mas pode ser super útil). Omita a parte "-maxdepth 0" se desejar tudo recursivamente. Nota: este é frágil, se os nomes de arquivos têm incorporado espaços, então você pode ler sobre xargs e -0 ( en.wikipedia.org/wiki/Xargs )
jgreve
0

Eu encontrei esse problema e, embora as soluções acima sejam elegantes, eu queria um hack rápido e sujo para esta situação: 1 diretório, com subdiretórios um nível dentro dele.

Portanto, insira o diretório em um shell e execute:

md5sum * */* 2>/dev/null > md5sum.md5

Isso obtém todos os arquivos no diretório de nível superior, remove o aviso de erro sobre os subdiretórios que são diretórios e, em seguida, executa md5sums no conteúdo do subdiretório. Vantagem: fácil de lembrar, faz exatamente o que deve fazer. Eu sempre fico confuso com a sintaxe de encontrar e nunca consigo me lembrar dela de cima para baixo, então não há necessidade de fazer um loop etc, lidando com espaços nos nomes de diretório, esse liner funcionou bem. Não é uma solução poderosa e robusta, não é boa para mais de um nível de subdiretórios, mas é uma solução rápida e fácil para o problema.

Lizardx
fonte