Como eu faço um hash de um diretório

1

Eu gostaria de testar se os processos que estou criando estão fazendo a mesma saída toda vez.

Eu gostaria de fazer isso criando um hash do conteúdo da pasta. Mas isso não deve levar em conta os tempos de modificação de arquivos nem os arquivos do tipo .DS_Store / thumbs.db.

Como posso conseguir isso?

    
por William Entriken 14.09.2016 / 01:30

1 resposta

2

Eu acho que você quer ter um único hash que leva em conta todos os arquivos em um diretório.

find . -name thumbs.db -prune -o -type f -exec cat {} \; | shasum -

Note que tentei usar o tar primeiro, mas a maioria dos formatos de arquivo inclui os timestamps, que não fornecem os resultados desejados.

Para testar isso, selecionei um diretório de origem e gerou o sha para ele da seguinte maneira. Note que encurtei o comando para gerar o sha para esta ilustração, o '-name thumbs.db -prune -o' só é usado se você precisar excluir alguns arquivos.

$ find Temp\ 20060810/ -type f | wc -l
    7207
$ du -hs Temp\ 20060810/
3.6G    Temp 20060810/
$ (cd ../Temp\ 20060810/ && find . -type f -exec cat {} \;  | shasum -)
f35837a72e7c94c974ed76723ac4fcff39e62646  -

Depois criei algumas cópias usando técnicas diferentes:

$ cp -r Temp\ 20060810/ ~/tmp/TEST1
$ (cd Temp\ 20060810/ && tar -cf - .) | (mkdir ~/tmp/TEST2 && tar -C ~/tmp/TEST2 -xf - )
$ rsync -a Temp\ 20060810/ ~/tmp/TEST3/
$ cp -aL Temp\ 20060810/ ~/tmp/TEST4/

Por fim, compare o hash das cópias ao hash do original:

$ (cd ~/tmp/TEST1 && find . -type f -exec cat {} \; | shasum -)
f35837a72e7c94c974ed76723ac4fcff39e62646  -
$ (cd ~/tmp/TEST2 && find . -type f -exec cat {} \; | shasum -)
f35837a72e7c94c974ed76723ac4fcff39e62646  -
$ (cd ~/tmp/TEST3 && find . -type f -exec cat {} \; | shasum -)
f35837a72e7c94c974ed76723ac4fcff39e62646  -
$ (cd ~/tmp/TEST4 && find . -type f -exec cat {} \; | shasum -)
f35837a72e7c94c974ed76723ac4fcff39e62646  -
    
por 14.09.2016 / 04:35

Tags