Certamente deve haver uma maneira de fazer isso facilmente!
Eu tentei os aplicativos de linha de comando do Linux como sha1sum
e, md5sum
mas eles parecem apenas ser capazes de calcular hashes de arquivos individuais e gerar uma lista de valores de hash, um para cada arquivo.
Preciso gerar um único hash para todo o conteúdo de uma pasta (não apenas os nomes dos arquivos).
Eu gostaria de fazer algo como
sha1sum /folder/of/stuff > singlehashvalue
Editar: para esclarecer, meus arquivos estão em vários níveis em uma árvore de diretório, eles não estão todos na mesma pasta raiz.
Respostas:
Uma maneira possível seria:
Se houver uma árvore de diretórios inteira, é melhor você usar find e xargs. Um comando possível seria
E, finalmente, se você também precisa levar em conta as permissões e diretórios vazios:
Os argumentos para
stat
farão com que ele imprima o nome do arquivo, seguido por suas permissões octais. As duas descobertas serão executadas uma após a outra, causando o dobro da quantidade de E / S do disco, a primeira encontrando todos os nomes de arquivos e fazendo a soma de verificação do conteúdo, a segunda encontrando todos os nomes de arquivos e diretórios, imprimindo nome e modo. A lista de "nomes de arquivos e somas de verificação", seguida por "nomes e diretórios, com permissões", terá a soma de verificação para uma soma de verificação menor.fonte
find ./folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum
/
napath/to/folder
broca.Use uma ferramenta de detecção de intrusão no sistema de arquivos como um assistente .
hash um tar ball do diretório:
tar cvf - /path/to/folder | sha1sum
Codifique algo você mesmo, como oneliner de vatine :
find /path/to/folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum
fonte
git config --local core.fileMode false
antes de se comprometer para evitar isso. Não sei se há mais advertências como esta.Você pode fazer
tar -c /path/to/folder | sha1sum
fonte
--mtime
opção da seguinte forma:tar -c /path/to/folder --mtime="1970-01-01" | sha1sum
.Se você quiser apenas verificar se algo mudou na pasta, recomendo este:
Ele apenas fornecerá um hash da saída do ls, que contém pastas, subpastas, seus arquivos, seu carimbo de data / hora, tamanho e permissões. Praticamente tudo o que você precisa para determinar se algo mudou.
Observe que este comando não gerará hash para cada arquivo, mas é por isso que deve ser mais rápido do que usar find.
fonte
Uma abordagem robusta e limpa
Isso é o que eu tenho em cima da minha cabeça, qualquer um que passou algum tempo trabalhando nisso praticamente teria pegado outras pegadinhas e casos difíceis.
Aqui está uma ferramenta , muito leve na memória, que atende a maioria dos casos, pode ser um pouco áspera nas bordas, mas tem sido bastante útil.
Um exemplo de uso e saída de
dtreetrawl
.Um snippet de saída amigável:
fonte
Se você quiser apenas hash o conteúdo dos arquivos, ignorando os nomes dos arquivos, então você pode usar
Certifique-se de ter os arquivos na mesma ordem ao calcular o hash:
Mas você não pode ter diretórios em sua lista de arquivos.
fonte
Outra ferramenta para conseguir isso:
http://md5deep.sourceforge.net/
Como parece: como md5sum, mas também recursivo, além de outros recursos.
fonte
Se este for um repositório git e você quiser ignorar todos os arquivos
.gitignore
, você pode querer usar isto:Isso está funcionando bem para mim.
fonte
Existe um script Python para isso:
http://code.activestate.com/recipes/576973-getting-the-sha-1-or-md5-hash-of-a-directory/
Se você alterar os nomes de um arquivo sem alterar sua ordem alfabética, o script hash não o detectará. Mas, se você alterar a ordem dos arquivos ou o conteúdo de qualquer arquivo, a execução do script fornecerá um hash diferente do anterior.
fonte
Tente fazer isso em duas etapas:
Igual a:
Ou faça tudo de uma vez:
fonte
for F in 'find ...' ...
não funciona quando você tem espaços nos nomes (o que você sempre faz hoje em dia).Eu canalizaria os resultados para arquivos individuais
sort
(para evitar uma mera reorganização de arquivos para alterar o hash) paramd5sum
ousha1sum
, o que você escolher.fonte
Eu escrevi um script Groovy para fazer isso:
Você pode personalizar o uso para evitar a impressão de cada arquivo, alterar o resumo da mensagem, remover o hash do diretório, etc. Eu testei com os dados de teste do NIST e funciona conforme o esperado. http://www.nsrl.nist.gov/testdata/
fonte
Eu tive que verificar em um diretório inteiro para alterações de arquivo.
Mas excluindo, timestamps, propriedades de diretório.
O objetivo é obter uma soma idêntica em qualquer lugar, se os arquivos forem idênticos.
Incluindo hospedados em outras máquinas, independentemente de qualquer coisa, exceto os arquivos, ou uma mudança neles.
Ele gera uma lista de hash por arquivo e, em seguida, concatena esses hashes em um.
Isso é muito mais rápido do que o método tar.
Para maior privacidade em nossos hashes, podemos usar sha512sum na mesma receita.
Os hashes também são idênticos em qualquer lugar usando sha512sum, mas não há maneira conhecida de revertê-lo.
fonte
sha256sum /tmp/thd-agent/* | sort
é o que estou tentando para um pedido confiável, então apenas hash.ls -r | sha256sum
?Você poderia
sha1sum
gerar a lista de valores hash e, em seguida,sha1sum
essa lista novamente, isso depende do que exatamente você deseja realizar.fonte
Aqui está uma variante simples e curta do Python 3 que funciona bem para arquivos de pequeno porte (por exemplo, uma árvore de origem ou algo assim, onde cada arquivo individualmente pode caber na RAM facilmente), ignorando diretórios vazios, com base nas idéias de outras soluções:
Funciona assim:
Você pode passar uma função hash diferente como segundo parâmetro se SHA-1 não for sua preferência.
fonte