Trouver des liens symboliques brisés avec Python
Si je l'appelle os.stat()
sur une fracture de la symlink
python renvoie une OSError
exception. Ceci le rend utile pour les trouver. Cependant, il ya quelques autres raisons qui os.stat()
peut lever une exception similaire. Est-il une manière plus précise de la détection cassé symlinks
avec Python sous Linux?
source d'informationauteur postfuturist
Vous devez vous connecter pour publier un commentaire.
Une commune Python dire, c'est qu'il est plus facile de demander pardon que la permission. Alors que je ne suis pas un fan de cette instruction dans la vie réelle, il ne s'applique dans beaucoup de cas. Habituellement, vous voulez éviter que les chaînes de deux appels système sur le même fichier, car vous ne savez jamais ce qui va arriver à la file entre vos deux appels dans votre code.
Une erreur typique consiste à écrire quelque chose comme:
Le second appel (os.unlink) peut échouer si quelque chose d'autre supprimés après votre test si, soulever une Exception, et d'arrêter le reste de votre fonction de l'exécution. (Vous pourriez penser que cela n'arrive pas dans la vraie vie, mais nous avons pêché un autre bug comme ça de notre base de code la semaine dernière - et c'était le genre de bug qui a laissé quelques programmeurs de se gratter la tête et alléguant "Heisenbug" pour les quelques derniers mois)
Donc, dans votre cas particulier, je serais probablement faire:
La gêne ici, c'est que stat renvoie la même erreur de code pour un lien symbolique qui n'est pas là et une fracture du lien symbolique.
Donc, je suppose que vous n'avez pas le choix que de casser l'atomicité, et faire quelque chose comme
os.lstat() peut être utile. Si lstat() réussit et stat() échoue, alors il est probablement un lien brisé.
Ce n'est pas atomique, mais il fonctionne.
os.path.islink(filename) and not os.path.exists(filename)
En effet par RTFM
(lire le fantastique manuel), nous voyons
Il dit aussi:
Donc, si vous êtes inquiet au sujet des autorisations, vous devez ajouter d'autres clauses.
Puis-je mentionner tests pour les liens sans python? /bin/test a la FICHIER1 -ef FICHIER2 condition est remplie lorsque les fichiers de partager un inode.
Donc, quelque chose comme
find . -type f -exec test \{} -ef /path/to/file \; -print
œuvres de lien en dur de test à un fichier spécifique.Qui m'amène à la lecture
man test
et les mentions de-L
et-h
qui travaillent tous les deux sur un fichier et retourne true si le fichier est un lien symbolique, mais cela ne vous dit pas si la cible est manquant.Je n'ai trouver que
head -0 FILE1
serait de retour un code de sortie de0
si le fichier peut être ouvert et un1
si elle ne peut pas, qui, dans le cas d'un lien symbolique vers un fichier fonctionne comme un test pour savoir si c'est la cible peut être lu.os.chemin
Vous pouvez essayer d'utiliser la fonction realpath() pour obtenir ce que le lien symbolique pointe vers, puis d'essayer de déterminer si c'est un fichier valide à l'aide de est fichier.
(Je ne suis pas en mesure d'essayer à l'instant, de sorte que vous aurez à jouer avec elle et voir ce que vous obtenez)
Je ne suis pas un python gars, mais il ressemble à de l'os.readlink()? La logique, que je voudrais utiliser dans le perl est d'utiliser readlink() pour trouver la cible et l'utilisation stat() pour tester si la cible existe.
Edit: je me suis cogné quelques perl qui démos readlink. Je crois que perl stat et readlink et python os.stat() et de l'os.readlink()sont à la fois des wrappers pour les appels système, de sorte que, ceci devrait se traduire raisonnable ainsi que la preuve de concept de code: