Checksumming recursivo

2

Eu tenho usado a seguinte linha de comando para fazer a soma de verificação recursiva dos diretórios. Parece que o trabalho foi feito, mas ainda sendo um novato que venho me perguntando, há algum problema potencial em fazer isso dessa maneira? É possível que este comando perca arquivos ou, de alguma outra forma, estrague tudo?

find ./dir/ -type f -exec sha1sum {} \; > files.sha1
    
por user2089518 26.03.2014 / 15:09

2 respostas

4

Não há nada errado que eu possa ver com a sua abordagem. Você está excluindo diretórios e o find incluirá arquivos ocultos por padrão. Sim, tudo bem.

Mas vou oferecer uma alternativa porque é isso que eu faço:

shopt -s globstar dotglob
sha1sum **

globstar ativa uma correspondência recursiva para ** e dotglob permite corresponder arquivos ocultos. Entre eles, eles se expandem para todos os nomes de arquivos e o sha1sum pode analisar todos eles.

O principal problema com essa abordagem é que ele passará todos os nomes dos arquivos para sha1sum em uma pilha de gordura. Embora isso possa ser um pouco mais rápido em pequenas cargas, ele explodirá se você tiver muitos nomes de arquivos. Eu não sei qual é o corte.

    
por Oli 26.03.2014 / 15:19
0

Script Python com hashlib e os.walk

Além de usar find e globstar , o Python tem módulos para cálculo de hashsum e passeio recursivo por meio da árvore de diretórios. Assim, pode-se escrever um script simples, tal como apresentado abaixo. Na verdade, esse script é praticamente o mesmo que eu usei para esta resposta com uma pequena diferença.

Este script pressupõe que você deseje percorrer o diretório de trabalho atual de modo recursivo, portanto, certifique-se de que cd seja o primeiro diretório desejado.

Também recomendo que você salve-o no diretório ~/bin e execute source ~/.bashrc antes do uso, pois assim você pode digitar o nome do script na linha de comando.

O script reúne todos os arquivos, incluindo os ocultos (com o ponto inicial no nome do arquivo).

Origem do script

#!/usr/bin/env python3
import os
import sys
from hashlib import sha1

def get_sha1sum(file_path):
    sha1sum = sha1()
    with open(file_path, 'rb') as fd:
        data_chunk = fd.read(1024)
        while data_chunk:
              sha1sum.update(data_chunk)
              data_chunk = fd.read(1024)
    return str(sha1sum.hexdigest())

def find_files(treeroot):
    for dir,subdirs,files in os.walk(treeroot):
         for f in files: 
             full_path = os.path.join(dir,f)
             path_sha1sum = get_sha1sum( full_path  )
             print(path_sha1sum,full_path)

def main():
    find_files('.')

if __name__ == '__main__': main()

Demo Run

bash-4.3$ cd Wallpapers/
bash-4.3$ recursive_checksum.py 
c66af072272d2c516e29832d0a86afa0e8e61d8c ./moon_moon.jpg
37829801c48ea0420414fc78de45adb13e4b117f ./wat.png
6cc3dd2541d00aa5fb8fd6ec703d3c7653ce4708 ./hard_drive_wallpapers/hard-drive.jpg
52fbff84cba6bbbfadc5777c1189ec39aef9176a ./hard_drive_wallpapers/hard-drive5.jpg
5bfe52eb8b31f50dc7bd1b1991dcc1d7260ec65e ./hard_drive_wallpapers/hard-drive4.jpg
f2f85eaa24c8c5b82bbedd55f887ea5fc520ac21 ./hard_drive_wallpapers/hard-drive3.jpg
bcdcf278c176fa93557627a33bedebe4e508e27a ./hard_drive_wallpapers/hard-drive2.jpg
    
por Sergiy Kolodyazhnyy 08.07.2017 / 00:40