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 69 70 71 72 73 74 75 76 77 78 79
| #!/usr/bin/python3
# -*- coding: utf-8 -*-
# Python 3.7
import os
from glob import iglob
from shutil import copy2
##############################################################################
def modifini(fichier, entete="en-GB."):
"""modifie le nom du fichier en retirant l'en-tête indiqué
"""
# sépare le chemin et le nom de fichier
chemin, nom = os.path.split(fichier)
# calcule le nouveau nom
if nom.startswith(entete):
# modifie le nom
nom = nom[len(entete):] # supprime l'en-tête
# recalcule le nouveau nom du fichier avec son chemin
fichier = os.path.join(chemin, nom)
# et retourne le nom (modifié ou pas) du fichier avec son chemin
return fichier
##############################################################################
def sauveselect(repsrce, repdest, motifs=['*'], modifie=None, 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 modifie=unefonction, modifie le fichier en appelant unefonction(...)
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
# modifie le nom de fichier destination si c'est demandé
if modifie is not None:
ficdest = modifie(ficdest)
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