Dans un environnement générique et moderne Unix (par exemple, GNU / Linux, GNU / Solaris ou Mac OS X), existe-t-il un bon moyen de déterminer sur quel point de montage et type de système de fichiers se trouve un chemin de fichier absolu particulier?
Je suppose que je pourrais exécuter la mount
commande et analyser manuellement la sortie de cela et la comparer en chaîne avec mon chemin de fichier, mais avant de le faire, je me demande s'il existe une méthode plus élégante.
Je développe un script BASH qui utilise des attributs étendus et je veux en faire la bonne chose (dans la mesure du possible) pour une variété de systèmes de fichiers et d'environnements hôtes.
la source
df -P
devrait produire une sortie standardisée sur tout système compatible POSIX. Certains systèmes loufoques peuvent également nécessiter une variable d'environnement magique, telle que POSIXLY_CORRECT.df /path-to-the-directory
vous donnera la partition contenant de ce répertoireVous pouvez utiliser stat . La commande stat --printf '% d' filename.txt renverra le numéro de périphérique en hexadécimal / décimal.
la source
stat --printf "%d"
vous indique le numéro mineur d'un périphérique, mais il reste du travail à faire pour obtenir le nom du périphérique et son système de fichiers monté.stat --format '%m' $file
il vous donnera le point de montage etstat --file-system --format '%T' $mount
fournira le nom du type de système de fichiers.Pour un fichier spécifique, c'est aussi simple que
la source
Hm. Pour le point de montage, vous pouvez remonter la hiérarchie jusqu'à ce que st_dev change (alors vous venez de franchir une limite de montage); il y a GNU
stat
pour les scripts bash; cependant, je ne sais pas comment deviner le type de système de fichiers sans analyse/proc/mounts
ou par essais et erreurs (c.-à-d. gérer les échecs après avoir défini des attributs étendus)la source
Un problème avec l'utilisation
df
est que si le nom du périphérique dans la sortie est long, sa ligne sera bouclée de sorte que vous ne pouvez pas simplement saisir la dernière ligne. À la place, supprimez la première ligne, puis saisissez la nouvelle première ligne, puis imprimez le premier champ:la source
Il semble y avoir un problème avec df et btrfs sous Linux. Lorsque vous demandez à df de localiser le point de montage d'un volume btrfs monté, il fera la bonne chose. Dans ce cas, joe est un sous-répertoire de / m / whale / backup.
Mais si le répertoire référencé est un sous-volume, il ne vous indiquera plus le point de montage.
Le / a / whale / backup est le seul point de montage selon le noyau.
FWIW, stat fait la même chose:
la source
Depuis /programming/2167558/give-the-mount-point-of-a-path :
fonctionne partout où j'ai testé, à la fois pour * BSD et sysVs, et pour les répertoires farfelus montés automatiquement. Je serais ravi d'entendre parler d'un cas où il échoue.
la source
os.path.splitunc()
ne fonctionne que pour les chemins UNC et n'est disponible que sous Windows .