Comment puis-je vérifier si se /my/dir
trouve sur la même partition que /
?
C'est pour l'intégration dans un script. Les montures de liaison doivent être manipulées correctement. Les solutions compatibles POSIX sont les bienvenues.
shell-script
mount
Totor
la source
la source
Réponses:
Vous pouvez vérifier cela avec stat:
Vous indique le numéro de périphérique et l'endroit où votre répertoire a été monté.
la source
stat
commande shell n'est pas POSIX ...La commande suivante donne un nom unique au point de montage contenant le fichier
$file
:Cela fonctionne sur n'importe quel système POSIX . L'
-P
option impose un format prévisible; le premier champ de la deuxième ligne est le «nom du système de fichiers». Ainsi, pour vérifier que deux fichiers se trouvent sous le même point de montage:Ou, pour enregistrer quelques appels de processus:
Quelques systèmes d'exploitation peuvent avoir des espaces dans les noms de volume. Il n'y a aucun moyen complètement fiable d'analyser la
df
sortie dans ce cas.Sous le capot, vous pouvez identifier le système de fichiers contenant un fichier par le
st_dev
champ renvoyé parstat
. Il n'y a aucun moyen portable de le faire à partir d'un script shell. Certains systèmes ont unstat
utilitaire, mais sa syntaxe varie:stat
signale lest_dev
champ lorsqu'il est appelé en tant questat -c %D -- "$file"
.stat
qui est compatible avec GNU coreutils. D'autres ontstat
sans%c
option; vous pouvez utiliser,stat -t -- "$file" | awk '{print $8}'
mais cela ne fonctionne que si le nom de fichier ne contient pas d'espaces, oustat -t -- "$file" | awk 'END {print $(NF-8)}'
qui accepte des noms de fichiers arbitraires mais pas avec de futurs ajouts de champs à lastat
sortie.stat
utilitaire différent qui nécessitestat -f %d -- "$file"
.stat
utilitaire.Si Perl est disponible, vous pouvez utiliser
et pour faire la comparaison:
Notez qu'il existe des cas d'angle où le résultat souhaité n'est pas clair. Par exemple, avec pochettes de protection se lient de Linux, après
mount --bind /foo /bar
,/foo
et/bar
sont considérés comme le même système de fichiers. Il est toujours possible que les deux fichiers se trouvent réellement sur le même appareil, mais vous ne le saurez jamais: par exemple, si les fichiers se trouvent sur deux montages réseau différents, le client n'a aucun moyen de savoir si le serveur exporte des systèmes de fichiers différents.Si les fichiers sont des répertoires et que vous pouvez y écrire, une autre méthode consiste à créer un fichier temporaire et à tenter de créer un lien dur. Celui-ci signale un résultat négatif sur les montages de liaison Linux.
la source
df
ne donne pas toujours le nom de l'appareil, mais parfois un lien symbolique vers celui-ci, comme/dev/disk/by-uuid/ca09b761-ae1b-450f-8a46-583327b48fb4
rendredf
non fiable. Jusqu'à présent, la seule option fiable consiste à utiliser unestat
solution basée sur.df
signalé pour le périphérique, il est cohérent entre les deux invocations, donc c'est correct pour une comparaison.df
rapport/dev/sda6
et/dev/disk/by-uuid/ca09b...
, tous deux faisant référence au même périphérique, mais à des points de montage différents. Le test de comparaison de chaînes échoue évidemment lors de la tentative avec des fichiers de chaque point de montage.mount /dev/sda6 /mnt1
suivi par desmount /dev/sda6 /mnt2
œuvres comme un charme.cat /proc/mounts
est bien avec ça. Cependant, ce n'est que depuis Wheezy qui/dev/disk/by-uuid/ca09b...
est affiché endf
tant que périphérique pour le système de fichiers racine. D'autres tentatives de montage à l'aide de ce lien sim ou de laUUID=ca09b...
syntaxe de montage ne finissent par afficher autre chose que/dev/sda6
dansdf
(je ne sais pas comment reproduire ce qu'il a fait pendant le processus de démarrage, mais ce n'est pas le problème ici).Fonctionne avec un nombre illimité de chemins.
la source
df
n'est pas toujours une bonne idée .$6
), pas le nom du périphérique ($1
), donc cela ne devrait pas être un problème.La meilleure solution infaillible disponible dans POSIX est la comparaison des ID de périphérique des fichiers fournis par la fonction stat (2) .
Perl a une même fonction stat que Gilles a fait remarquer :
mais la "façon POSIX" consiste à utiliser un programme C comme:
dont le code source est le suivant:
Si les ID de périphérique des deux fichiers sont égaux, ils sont hébergés sur le même système de fichiers, auquel cas, les commandes ci-dessus renvoient 0 (une autre valeur sinon). Vérifiez avec
echo $?
.Cela fonctionne bien avec les montages de liaison, mais probablement pas avec les montages réseau.
la source