Comment trouver le point de montage sur lequel un fichier réside?
Par exemple, j'ai un fichier avec le chemin suivant:
/media/my_mountpoint/path/to/file.txt
J'ai eu tout le chemin et que vous souhaitez obtenir:
/media/my_mountpoint
Comment puis-je faire cela? De préférence en Python et sans utiliser des bibliothèques externes /outils. (Les deux ne sont pas une exigence.)
source d'informationauteur Georg Schölly | 2010-12-15
Vous devez vous connecter pour publier un commentaire.
Vous pouvez soit appeler le
mount
de commande et d'analyser sa sortie afin de trouver le plus long préfixe commun avec votre chemin, ou d'utiliser lestat
appel système pour obtenir le dispositif sur lequel réside le fichier et aller jusqu'à l'arbre jusqu'à ce que vous arrivez à un autre appareil.En Python,
stat
peut être utilisé comme suit (non testé et peut être étendu pour gérer les liens symboliques et exotiques, des trucs comme l'union de monts):Modifier: je ne savais pas à propos de
os.path.ismount
jusqu'à ce que tout à l'heure. Cela simplifie grandement les choses.Depuis le python n'est pas une exigence:
La
NR==1 {next}
est de passer la ligne d'en-tête que df sorties.$6
est le point de montage.exit
est de s'assurer que nous avons sortie une seule ligne.Depuis aujourd'hui, nous ne pouvons pas vraiment fiable d'analyser le contenu de
mount
dans les systèmes où un système de fichiers a été monté parUUID
ouLABEL
la sortie peut contenir quelque chose comme:nous avons besoin d'une solution plus robuste (par exemple, pensez à ce que "hacher" les parties d'un chemin comme ci-dessus peuvent conduire à, et si nous désirons quelque chose comme ça).
Une telle solution (qui, au passage, essaie de ne pas réinventer la roue) est d'utiliser simplement le
stat
commande de découvrir le point de montage où se trouve le fichier, comme dans:Dans la sortie ci-dessus, nous pouvons voir que:
%h
) dansTalks
est de 6%m
) est/media/lattes
%i
) est 461246.Juste pour le record, c'est avec la version de
stat
de GNU coreutilsce qui signifie que certaines autres versions (par exemple, le Bsd) peut-être pas par défaut (mais vous pouvez toujours l'installer avec votre gestionnaire de paquet préféré).Je travaillais sur un GTK+ 3 gestionnaire de fichiers en Python et est venu à travers la nécessité même si la boucle au travers de fichiers.
L'ordinateur, je travaille sur Linux et OS X partitions. Lorsque le gestionnaire de fichiers de l'application (en cours d'exécution sur la partition racine Linux) tentent d'indexer les fichiers sur la partition OS X, il serait rapidement trouver un absolu lien symbolique "/media/mac-hd/les Guides de l'Utilisateur Et de l'Information" à "/Bibliothèque/Documentation/Guides de l'Utilisateur et de l'Information.localisée" et de s'étouffer. Le problème était que le gestionnaire de fichiers a été à la recherche de l'absolu cible du lien sur son propre système de fichiers où il n'existe pas à la place de l'OS X de la partition montée sur /media/mac-hd. Donc, j'ai besoin d'un moyen d'identifier un fichier sur un autre point de montage et d'ajouter que le point de montage de l'objectif absolu de la liaison.
J'ai commencé à monté en solution dans Fred Foo's réponse. Il semble pour aider à fournir une solution à l'erreur en question, j'ai essayé de travailler autour de. Lorsque j'appellerais
find_mount_point('/media/mac-hd/User Guides And Information')
il serait de retour/media/mac-hd
. Super, je pensais.J'ai remarqué insécurité'commentaire ci-dessous est la réponse pour le faire fonctionner avec les liens symboliques et également remarqué qu'il était correct sur /var/run:
Quand j'ai essayé de remplacer
os.path.abspath()
avecos.path.realpath()
je voudrais obtenir la bonne valeur de retour de/run
pour/var/run
. Cependant j'ai aussi remarqué que je n'est plus la valeur que je voulais lors de l'appel defind_mount_point('/media/mac-hd/User Guides And Information')
parce qu'il est maintenant retourné/
.Voici la solution que j'ai fini de l'utiliser. Peut-être il peut être simplifiée:
Mon python est rouillé, mais vous pouvez utiliser quelque chose comme ceci avec perl :
avis de la " '' " autour de $PATH_TO_LOOK_FOR, sinon ça ne fonctionne pas.
//edit : python solution :
@larsmans Très bonne réponse, c'était très serviable! J'ai mis en œuvre cette Golang où j'en avais besoin.
Pour les gens qui sont intéressés dans le code (ce qui a été testé pour OS X et Linux):