IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Python Discussion :

Utiliser des liens symboliques sous Windows


Sujet :

Contribuez Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut Utiliser des liens symboliques sous Windows
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.symlink(fichiercible, fichierlien, target_is_directory=False)

    - Créer un lien symbolique vers un répertoire cible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.symlink(fichiercible, fichierlien, target_is_directory=True)

    - Copier un lien symbolique seul sans copier son fichier cible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shutil.rmtree(repertoire)

    - Trouver la date du lien symbolique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 765
    Par défaut
    Salut,

    Citation Envoyé par tyrtamos Voir le message
    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 et sélectionnées dans la liste.
    Les liens symboliques viennent avec NTFS (et sont assez récents)... Mais ce système de fichiers vient aussi avec des "tags" qui permettent de faire bien mieux.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    bonjour
    pas trouvé comment avoir la date du lien symbolique lui-même
    perso je suis un utilisateur de pathlib (Path est un objet fichier compatible multi-os)
    https://docs.python.org/fr/3/library...hlib.Path.stat

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par papajoker Voir le message
    perso je suis un utilisateur de pathlib (Path est un objet fichier compatible multi-os)
    https://docs.python.org/fr/3/library...hlib.Path.stat
    Merci, je vais essayer!

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Citation Envoyé par wiztricks Voir le message
    Les liens symboliques viennent avec NTFS (et sont assez récents)... Mais ce système de fichiers vient aussi avec des "tags" qui permettent de faire bien mieux.
    Merci pour l'info, mais comme il m'arrive de travailler sous Linux, je ne voulais pas m'éloigner du codage "multiplateforme" en utilisant au maximum les instructions Python communes Windows et Unix.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 765
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Merci pour l'info, mais comme il m'arrive de travailler sous Linux, je ne voulais pas m'éloigner du codage "multiplateforme" en utilisant au maximum les instructions Python communes Windows et Unix.
    Sous Linux, les systèmes de fichiers les plus répandus ont l'équivalent (file extended attributes).
    Après, si on veut faire quelque chose de flexible et de portable, on peut faire une base de données comme le fait cs.fstags (ou d'autres bibliothèques).

    Ceci dit bravo pour l'effort juste que coder une solution sans mentionner le pourquoi ce qui existe ne répond pas au besoin c'est juste réinventer la roue.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 143
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    - Trouver la date du lien symbolique => donne en fait celle du fichier cible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.path.getmtime(fichierlien)
    NB: je n'ai pas trouvé comment avoir la date du lien symbolique lui-même: si quelqu'un a la solution, je suis intéressé!
    Salut,
    Pour obtenir la date du lien symbolique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    os.lstat(fichierlien).st_mtime

  8. #8
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour

    Citation Envoyé par Diablo76 Voir le message
    Pour obtenir la date du lien symbolique :
    Merci à Diablo76 et à papajoker pour leurs bonnes solutions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    fichierlien = r"D:\Temp\photos_2007_2\58 051 071_00845.jpg"
     
    print(os.lstat(fichierlien).st_mtime)
     
    print(os.stat(fichierlien, follow_symlinks=False).st_mtime)
     
    from pathlib import Path
    p = Path(fichierlien)
    print(p.stat(follow_symlinks=False).st_mtime)
    Les 3 solutions donnent le même et bon résultat.

    J'ai choisi la plus simple, celle avec os.lstat. J'ai modifié mon post en conséquence.

Discussions similaires

  1. Comment supprimer un lien symbolique sous windows ?
    Par serigne dans le forum Windows 8
    Réponses: 1
    Dernier message: 25/03/2016, 06h52
  2. liens symboliques sous word 2010 sous windows 7
    Par cpf2006 dans le forum Word
    Réponses: 5
    Dernier message: 06/12/2010, 10h04
  3. Créer des liens "durs" sous windows
    Par guidav dans le forum Windows 2000/Me/98/95
    Réponses: 6
    Dernier message: 19/11/2007, 09h54
  4. Réponses: 1
    Dernier message: 03/07/2007, 18h23
  5. Lien symbolique sous Windows
    Par mout19 dans le forum Windows
    Réponses: 4
    Dernier message: 06/07/2006, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo