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
   | #!/usr/bin/python3
# -*- coding: utf-8 -*-
# Python 3.7
 
import os
from glob import iglob
from shutil import copy2
 
##############################################################################
def sauveselect(repsrce, repdest, motifs=['*'], affiche=False):
    """Trouve (recherche récursive) les fichiers du répertoire source repsrce 
       satisfaisant l'un des motifs 'wildcard' de la liste motifs,
       et les recopie dans le répertoire destination 'repdest' seulement si:
       - le fichier source n'existe pas dans la destination,
       - ou le fichier source est plus récent que le fichier destination
       Si affiche=True: affiche les opérations faites en console
       Retourne le nombre de fichiers trouvés + copiés, ainsi que les erreurs
    """
    # normalisation des répertoires
    repsrce = os.path.abspath(os.path.expanduser(repsrce))
    lgrepsrce = len(repsrce) # longueur du chemin du répertoire source
    repdest = os.path.abspath(os.path.expanduser(repdest))
 
    # traitement des recopies
    erreurs = []
    nsrce, ndest = 0, 0
    for motif in motifs:
        for ficsrce in iglob(os.path.join(repsrce, "**", motif), recursive=True):
 
            if os.path.isfile(ficsrce): # on ne s'intéresse qu'aux fichiers
 
                nsrce += 1 # nouveau fichier source trouvé
                ficdest = repdest + ficsrce[lgrepsrce:] # => fichier destination
 
                rep = os.path.dirname(ficdest) # répertoire du fichier destination
                if not os.path.exists(rep):
                    # crée le ou les répertoire(s) manquant(s) de la destination
                    os.makedirs(rep)
 
                if not os.path.exists(ficdest):
                    # fichier destination absent => recopie du fichier source
                    try:
                        copy2(ficsrce, ficdest)
                        ndest += 1
                        if affiche: print("Recopie fichier absent de la destination:", ficsrce)
                    except Exception as msgerr:
                        erreurs.append(str(msgerr))    
                else:
                    # ici, on sait que le fichier destination existe déjà
                    if os.path.getmtime(ficsrce) > os.path.getmtime(ficdest):         
                        # fichier source plus récent => recopie
                        try:
                            copy2(ficsrce, ficdest)
                            ndest += 1
                            if affiche: print("Recopie fichier plus récent que la destination:", ficsrce)
                        except Exception as msgerr:
                            erreurs.append(str(msgerr))    
 
    return nsrce, ndest, erreurs | 
Partager