web-dev-qa-db-fra.com

Vérification récursive

J'utilise la ligne de commande suivante pour effectuer une somme de contrôle récursive des répertoires. Il semble que le travail soit fait, mais étant toujours novice, je me demandais s'il y avait des problèmes potentiels à le faire de cette façon? Est-il possible que cette commande manque des fichiers ou gâche autrement?

find ./dir/ -type f -exec sha1sum {} \; > files.sha1
3
user2089518

Il n'y a rien de mal à voir avec votre approche. Vous excluez les répertoires et find inclura les fichiers cachés par défaut. Ouais, ça va.

Mais je vais vous proposer une alternative car c'est ce que je fais:

shopt -s globstar dotglob
sha1sum **

globstar active une correspondance récursive pour ** et dotglob permet de faire correspondre les fichiers cachés. Entre eux, ils s'étendent à tous les noms de fichiers et sha1sum peut tous les analyser.

Le principal problème avec cette approche est qu'elle passera tous les noms de fichiers à sha1sum dans un gros tas. Bien que cela puisse être un peu plus rapide à petites charges, il explosera si vous avez trop de noms de fichiers. Je ne sais pas quelle est la coupure.

6
Oli

Script Python avec hashlib et os.walk

Mis à part l'utilisation de find et globstar, python a des modules pour le calcul du hachage et la marche récursive dans l'arborescence des répertoires. Ainsi, on peut écrire un script simple tel que présenté En fait, ce script est à peu près le même que ce que j'ai utilisé pour cette réponse avec une différence mineure.

Ce script suppose que vous voulez parcourir récursivement le répertoire de travail en cours, assurez-vous donc de cd dans le premier répertoire souhaité.

Je vous recommande également de l'enregistrer dans ~/bin répertoire et exécutez source ~/.bashrc avant utilisation, puisque de cette façon, vous pouvez simplement taper le nom du script en ligne de commande.

Le script rassemble tous les fichiers, y compris ceux cachés (avec le premier point dans le nom de fichier).

Source de 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 __== '__main__': main()

Démo 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
0