Home Diffbackup.py - uno script per il backup differenziale
Post
Cancel

Diffbackup.py - uno script per il backup differenziale

Utilizzo:

1
python3 diffbackup.py /cartellaorigine /cartelladestinazione
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import os
import hashlib
import shutil
import argparse


def hash_file(file_path):
    """
    Calcola l'hash SHA-256 del file specificato
    """
    hash_object = hashlib.sha256()
    try:
        with open(file_path, 'rb') as f:   
            for chunk in iter(lambda: f.read(4096), b""):
                hash_object.update(chunk)
        return hash_object.digest()
    except IsADirectoryError:
        return None

def backup_files(src_dir, dst_dir):
    """
    Copia tutti i file nella directory di origine nella directory di destinazione
    Se un file è già presente nella directory di destinazione e ha lo stesso hash, non viene copiato
    """
    # crea la directory di destinazione se non esiste
    os.makedirs(dst_dir, exist_ok=True)

    # copia tutti i file nella directory di origine
    for root, dirs, files in os.walk(src_dir):
        for filename in files:
            src_path = os.path.join(root, filename)
            dst_path = os.path.join(dst_dir, os.path.relpath(src_path, src_dir))

            # controlla se il file è stato modificato
            src_hash = hash_file(src_path)
            if os.path.exists(dst_path):
                dst_hash = hash_file(dst_path)
                if src_hash == dst_hash:
                   # print(f"Skipping {src_path} (already exists and has not been modified)")
                    continue

            # copia il file nella directory di destinazione
            os.makedirs(os.path.dirname(dst_path), exist_ok=True)
            shutil.copy2(src_path, dst_path)
            print(f"Copied {src_path} to {dst_path}")

def main():
    # Parsing degli argomenti da terminale
    parser = argparse.ArgumentParser(description='Effettua la copia dei file da una directory di origine ad una di destinazione')
    parser.add_argument('origine', metavar='DIR_ORIGINE', type=str, help='Percorso della directory di origine')
    parser.add_argument('destinazione', metavar='DIR_DESTINAZIONE', type=str, help='Percorso della directory di destinazione')
    args = parser.parse_args()

    # Verifica che la directory di origine esista
    if not os.path.exists(args.origine):
        print(f"Errore: La directory '{args.origine}' non esiste")
        return

    # Verifica che la directory di destinazione esista o la crea se non esiste
    if not os.path.exists(args.destinazione):
        os.makedirs(args.destinazione)

    # Effettua la copia dei file
    backup_files(args.origine, args.destinazione)

if __name__ == '__main__':
    main()

This post is licensed under CC BY 4.0 by the author.