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.
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.
Respostas:
Você pode passar md5sum
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
drill down e filtrar os arquivos, além de trabalhar recursivamente:
find -type f -exec md5sum "{}" + > checklist.chk
md5sum
os arquivos dentro sub-diretórios, o acima md5sum *
emissor de entrar em nível de subdiretório dizendo ... é um diretório
find -type f -exec md5sum '{}' +
e `find -type f -exec md5sum '{}' 'eu consegui obtê-lo. Obrigado :)
openssl md5 * > checklist.txt
**
recursivamente (como o zsh), é ainda mais simples:md5sum **/* 2>/dev/null
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 /home
diretó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.
Aqui estão dois exemplos mais abrangentes:
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
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:
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.
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.