sha1sum ./path/to/directory/* | sha1sum
o acima foi postado como uma maneira de calcular um sha1sum de um diretório que contém arquivos. Este comando falhará se o diretório incluir mais diretórios. Existe uma maneira de calcular recursivamente o sha1sum de um diretório de diretórios universalmente (sem o ajuste personalizado de um algoritmo para o diretório específico em questão)?
find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum
@allquixoticEu geralmente gosto do padrão "find | xargs", assim:
Você precisa usar "-print0" e "-0", caso haja espaços nos nomes dos arquivos.
No entanto, isso é muito semelhante ao padrão "find -exec cmd {}".
Consulte uma discussão comparando os dois padrões aqui: https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs
fonte
find . -type f -print0 | xargs -0 sha1sum | awk '{print $1}' | sha1sum
.ATUALIZAÇÃO: Faz alguns anos que não postei essa resposta e, enquanto isso, reescrevi e aprimorei o script que apresentei aqui várias vezes. Decidi repassar o novo script como uma resposta totalmente nova. Eu recomendo sobre este.
INTRODUÇÃO
Observei que a ordem na qual o comando find gera os elementos encontrados em um diretório varia em diretórios idênticos em diferentes partições. Se você estiver comparando os hashes do mesmo diretório, não precisará se preocupar com isso, mas se estiver obtendo os hashes para garantir que nenhum arquivo tenha sido perdido ou corrompido durante uma cópia, será necessário incluir uma linha adicional para classificando o conteúdo do diretório e seus elementos. Por exemplo, a resposta de Matthew Bohnsack é bastante elegante:
Mas se você o estiver usando para comparar um diretório copiado com o original, você enviaria a saída para um arquivo txt que você compararia com a lista de saída do outro diretório usando o Kompare ou o WinMerge ou simplesmente obtendo os hashes de cada lis . O fato é que, como a ordem na qual a ferramenta de localização produzirá o conteúdo pode variar de um diretório para outro, o Kompare sinalizará muitas diferenças porque os hashes não foram calculados na mesma ordem. Não é grande coisa para pequenos diretórios, mas é bastante irritante se você estiver lidando com 30000 arquivos. Portanto, você deve executar as etapas extras de classificação da saída para facilitar a comparação das listas de hash entre os dois diretórios.
Isso classificaria a saída para que os arquivos com o mesmo hash fiquem nas mesmas linhas ao executar o programa diferencial (desde que nenhum arquivo esteja faltando no novo diretório).
E NO SCRIPT ...
Aqui está um script que eu escrevi. Ele faz o mesmo que a resposta find / xarg, mas classifica os arquivos antes de obter o sha1sum (mantendo-os no mesmo diretório). A primeira linha do script localiza todos os arquivos no diretório recursivamente. O próximo classifica os resultados em ordem alfabética. Os dois a seguir pegam o conteúdo classificado e anexam um sha1sum e aspas aos arquivos na lista classificada, criando um grande script de shell que calcula o hash de cada arquivo, um de cada vez e o envia para content_sha1sum.txt.
Espero que isto ajude.
fonte
sort -z
(--zero-terminated
) é mais fácil do que mexer com vários arquivos.INTRODUÇÃO
Alguns anos atrás, escrevi e apresentei (neste tópico) um script que pode verificar as assinaturas de hash de todos os arquivos individuais na estrutura de diretórios atual e produzi-lo como uma lista em um arquivo de texto.
Desde então, refinei essa fórmula várias vezes. Decidi postar novamente meu script novo e aprimorado aqui como uma resposta separada. Ele foi escrito para sha256, mas qualquer um que ainda queira usar o sha1 pode fazer uma pesquisa simples e substituir no gedit para trocar o sha256 pelo sha1. Pessoalmente, não uso o sha1 há alguns anos e não o recomendaria, pois ficou antiquado e o Google demonstrou como pode ser comprometido .
Aqui está o que meu novo script faz:
Você pode simplesmente usar o script indo para o diretório que deseja fazer o hash e inserindo:
Como alternativa, você pode chamar esse script de outro diretório fazendo:
O script detectará se você possui privilégios de gravação no diretório atual. Se você fizer isso, os resultados serão salvos no diretório atual. Se você não tiver privilégios de gravação ou se o diretório atual estiver em um sistema somente leitura (como um cdrom), os resultados serão salvos no diretório inicial do usuário atual.
O script detectará se alguns dos subdiretórios não estão acessíveis nos privilégios atuais do usuário. Se tudo estiver legível, nenhuma elevação de privilégio ocorrerá, se não estiver, os privilégios do usuário serão elevados à raiz.
Localizar é usado para encontrar todos os arquivos na estrutura atual do diretório (incluindo todos os subdiretórios). A classificação é usada para garantir que os resultados sejam gerados em ordem alfabética. A lista resultante passa por sha256sum e é gerada em um arquivo de texto.
Desde que escrevi o script antigo, adotei uma filosofia de design de que os arquivos temporários são ruins e devem ser evitados sempre que possível, pois deixam os usuários abertos para bisbilhotar e adulterar por terceiros maliciosos. Portanto, todos os dados desse novo script são manipulados como variáveis até o último minuto em que os resultados são gerados como um arquivo de texto.
O arquivo resultante em si é hash e o caminho / hash é gerado no terminal. Gosto de tirar fotos desses hashes com uma câmera off-line da velha escola para garantir que o arquivo de resultados não seja violado quando me refiro a ele posteriormente.
Arquivos de resultados antigos são ignorados no registro. Facilita a comparação dos resultados.
Aqui está um exemplo da saída do terminal ao executar meu script:
Aqui está um trecho da saída que pode ser encontrada em 000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt:
(continua por mais de 7000 linhas como essa, mas você entendeu)
INSTALAÇÃO
Abra um terminal e insira os seguintes comandos:
No nano, use Shif + Ctrl + v para colar. Ctrl-O e Enter para salvar. O Ctr-X sai. Cole meu script lá:
(cole após o #! / bin / bash)
Ao sair do nano, certifique-se de sair do status elevado digitando:
PENSAMENTOS FINAIS
Isso só funcionará se você tiver o bash instalado. Eu usei alguma sintaxe para manipulação de substring que não funciona com sh, dash, ksh ou zsh. Você ainda pode usar qualquer um dos outros shells como seus drivers diários, mas o bash precisa ser instalado.
As listas produzidas podem ser comparadas com diversas ferramentas, como: (no terminal) diff, sdiff (e gráfica) difusa, kdiff, winmerge.
Meu arquivo classifica a saída com base no caminho, para facilitar a leitura por seres humanos. Notei que o comando de classificação funciona de maneira diferente em diferentes distribuições. Por exemplo, em uma distribuição, as letras CAPITAL priorizavam as letras maiúsculas e, na outra, não. Isso afeta a ordem das linhas dos arquivos de saída e pode dificultar a comparação. Isso não deve apresentar problemas se você estiver sempre usando o script na mesma distribuição, mas poderá se as listas de hashes forem geradas em dois ambientes diferentes. Isso é facilmente remediado, classificando os arquivos hash mais um tempo, para que as linhas sejam ordenadas por hash, e não por caminho:
fonte
#!/usr/bin/env bash
- ela também encontrará o Bash em outros diretórios, porque o último pode ser instalado em / usr / bin em vez de / bin , por exemplo, enquanto o env tende a estar em / usr / bin o tempo todo tanto quanto eu notei. Também vale a pena notar que, como você precisa do Bash, você pode usar a[[ blah-blah ]]
expressão condicional entre parênteses em vez da[ blah-blah ]
variante mais genérica entre parênteses.Isso parece funcionar para mim:
EDIT: isso somará todos os arquivos contidos na árvore de diretórios. Se o nome de um diretório fosse alterado, isso não ocorreria. Talvez algo como:
Faria isso. Sobre a mesma resposta que a outra
fonte
Outro truque pode ser o uso de tar para misturar o conteúdo e os metadados do arquivo:
fonte
Solução rápida, robusta e portátil
Ao contrário de algumas das outras soluções envolvidas
tar
, a solução abaixo funciona em qualquer máquina que possua os utilitários Unix padrão e é mais rápida que todas as outras soluções, paralelizando a soma de verificação:Como ele usa uma classificação no final, não há progresso em tempo real, então deixe o comando executar.
Aqui está o que os argumentos fazem:
find . -type f
localiza todos os arquivos no diretório atual e seus subdiretóriosxargs -d'\n'
divide a saída de localização em linhas (se você espera ter arquivos com novas linhas, faça o habitualfind -print0 | xargs -0
)-P0 n1
é executadomd5sum
em processos paralelos, usando o número máximo de processos suportados pela máquina (multi-core!)sort -k 2
classifica pelo segundo campo damd5sum
saída, que é o caminho completo para cada arquivo (o primeiro é o MD5)md5sum
calcula uma soma de verificação da lista de somas de verificação de arquivo, para que você obtenha uma soma de verificação de todo o diretório em uma linha, que você pode comparar facilmente visualmente nas janelas do terminalAntes de dizer que "o MD5 foi comprometido", lembre-se de qual é o seu modelo de ameaça. Você está tentando garantir que os arquivos copiados de outro host ou disco cheguem intactos? Então o MD5 é mais que suficiente, porque as chances de um arquivo ser corrompido em trânsito, mas com o mesmo MD5, são zero. Mas se você tem medo de um invasor ter tempo para substituir um arquivo por outro com uma soma de verificação em colisão, use
sha256sum
. A desvantagem é que as funções SHA são mais lentas que o MD5 .Progresso detalhado em tempo real
Por fim, se você deseja ver o progresso em tempo real, modifique o pipeline para usar um arquivo temporário para as somas de verificação:
(Observe que mover a
sort
direita depoisfind
não funcionaria, porquexargs -P0
paralelizamd5sum
e os resultados podem chegar fora de ordem.)Esta versão do comando também permite diferenciar os dois
/tmp/sums
arquivos (renomeie o segundo se estiver na mesma máquina) e veja quais arquivos diferem.fonte
Em vez de ter UM arquivo enorme contendo todas as informações de hash, eu estava procurando uma maneira de criar um arquivo em cada pasta de uma árvore. Eu me inspirei nos comentários aqui. O meu é um pouco mais complexo do que o postado aqui. Eu uso a rotação de arquivos, mas isso é o menos complexo para novos players. Esta versão substituirá as somas de verificação antigas por novas. Pode ser bom manter de duas a três versões, dependendo da frequência com que você a executa e da necessidade de 'profundidade'.
Observe que mkshaindir, para meus propósitos, é um componente separado, pois pode ser necessário criar um hash de arquivos em uma nova pasta ou em uma que foi alterada recentemente. Tudo isso pode ser combinado em um script, se necessário.
O resto é deixado como um exercício para o leitor.
fonte
com base na resposta anterior :
find ./path/to/directory -print0 | LC_ALL=C sort --zero-terminated | tar --create --no-recursion --null --files-from /dev/stdin --file /dev/stdout --verbose --numeric-owner | sha1sum
fonte
@allquixotic
A resposta de não gera os mesmos hashes em máquinas diferentes que não nos ajudarão a verificar e ter hashes consistentes.A linha a seguir
find . -type f \( -exec md5sum "$PWD"/{} \; \)
retorna a seguinte saída:Portanto, o caminho seria diferente em máquinas diferentes.
awk '{print $1}'
nos ajudará a obter a primeira coluna, que possui apenas o hash dos arquivos. Posteriormente, precisamos classificar esses hashes, onde a ordem pode ser diferente em máquinas diferentes, o que também pode nos levar a ter hashes diferentes, se houver mais de dois arquivos.Solução:
Para Mac:
Para Linux:
fonte