Certains pensent que les liens symboliques n'appartiennent qu'à Linux ou MacOS, mais certainement pas à Windows. Et bien c'est une erreur: Windows utilise très bien les liens symboliques, même si on sent que c'est un ajout plutôt récent pour Windows, et qui n'a pas encore été complétement "digéré" par tous ses outils. Par exemple, sous l'explorateur de fichiers, toutes les opérations de copier-coller ainsi que toutes les copies et déplacements de liens symboliques les verra remplacés par leur fichiers cibles! Pour les programmes de console cmd.exe, "xcopy" prévoit la copie de liens symboliques en tant que liens symboliques (option /b crée pour Vista), mais pas "copy".
Je me suis intéressé aux liens symboliques pour résoudre un de mes problèmes concernant la recherche et la consultation de fichiers images (photos), et non seulement je suis très satisfait du résultat, mais je ne vois pas comment j'aurais pu y arriver autrement.
Mon problème à résoudre
Comme je fais des photos depuis très longtemps, j'ai un grand nombre de fichiers images (environ 35.000 et 400Go) dispersés dans un seul gros répertoire "Images". Comment je fais pour trouver et consulter toutes les photos de l'année 2018, par exemple? je peux toujours faire une boucle pour les trouver selon le critère de la date de chaque fichier (os.path.getmtime(...)), mais une fois la liste trouvée, comment les consulter? Si j'ai 2000 fichiers dans la liste, qui sont dispersés dans l'arborescente du répertoire, je ne peux pas passer d'un chemin à l'autre pour les afficher, j'y passerais un temps fou !
La solution avec les liens symboliques est évidente: Je crée un répertoire "Photos2018" dans lequel je vais créer les liens symboliques vers les photos dispersées sur le disque et sélectionnées dans la liste. Et un logiciel de visualisation d'images comme l'excellent "FastStone" (qui en plus est gratuit), affichera sans problème dans une même page toutes les photos ciblées par les liens symboliques du répertoire ainsi créé. Problème résolu!
Mieux encore. Comme ce sont des fichiers photos (format jpg mais pas seulement), les fichiers intègrent des données relatives à la prise de vue, les "exifs". Ainsi, grâce à des programmes comme "exiftool" (https://exiftool.org/), je peux sélectionner les fichiers selon:
- la date et l'heure de la prise de vue
- l'appareil photo utilisé (la marque ou l'appareil lui-même)
- l'objectif
- les réglages de l'appareil photo
- et même les coordonnées GPS, si ces données existent dans les exifs !
- etc...
Principales instructions pour manipuler les liens symboliques
Comme je n'ai pas réussi à trouver une page web qui dit tout sur les liens symboliques sous Windows, je me suis fait le pense-bête suivant.
Attention cependant, à part pour une simple lecture, il faut les droits administrateur pour manipuler les liens symboliques. Pour demander ces droits, il existe des modules tout fait (voir pypi). En ce qui me concerne, j'utilise le code décrit dans mon fil ici: https://www.developpez.net/forums/d2...-sous-windows/.
- Créer un lien symbolique vers un fichier cible:
os.symlink(fichiercible, fichierlien, target_is_directory=False)
- Créer un lien symbolique vers un répertoire cible:
os.symlink(fichiercible, fichierlien, target_is_directory=True)
- Copier un lien symbolique seul sans copier son fichier cible:
shutil.copy2(fichierliensrce, fichierliendest, follow_symlinks=False)
NB: par défaut, copy2 remplace le lien symbolique par son fichier cible
- Copier un répertoire contenant des liens symboliques qui seront copiés comme
liens symboliques:
shutil.copytree(repsrce, repdest, symlinks=True)
- Effacer un lien symbolique sans effacer sa cible (fichier ou répertoire)
NB: heureusement, la suppression d'un lien symbolique ne supprime pas sa cible !
- Effacer un répertoire contenant des liens symboliques sans effacer leurs
fichiers cibles:
shutil.rmtree(repertoire)
- Trouver la date du lien symbolique
os.lstat(fichierlien).st_mtime
NB: os.path.getmtime(fichierlien) donne en fait la date du fichier cible
- Trouver le chemin de la cible d'un lien symbolique:
chemin = os.readlink(fichierlien)
NB: sous Windows, donne un chemin "UNC" ((Universal Naming Convention))
Format UNC: \\nom-hôte\nom-partage\chemin-fichier-dossier sous Windows
Exemple: r'\\?\C:\Images\Cartes\58 051 071.jpg'
D'après ce que j'ai vu, les autres instructions Python acceptent très bien ce format sous Windows.
Impact sur mon programme de sauvegarde incrémentale
J'avais prévu dès le départ une option "suiviliens" pour l'appel de os.walk, afin de lui demander de "suivre" ou pas les éventuels liens symboliques. Mais il faut maintenant compléter le code avec son introduction dans les instructions de copie (shutil.copy2(..., follow_symlinks=suiviliens)). Cela fera que si des liens symboliques existent dans le répertoire à sauvegarder, ils seront recopiés comme liens symboliques avec suiviliens=False.
Je décrirai cette modification avec le code final dans le fil correspondant:
https://www.developpez.net/forums/d2...entale-python/
Amusez-vous bien !
Partager