web-dev-qa-db-fra.com

Comment tester si un chemin donné est un point de montage

Supposons que vous souhaitiez tester si/mnt/disk est un point de montage dans un script Shell. Comment est-ce que tu fais ça?

33
Andrea Francia

Je découvre que sur mon Fedora 7, il existe une commande de point de montage.

De l'homme point de montage:

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       /bin/mountpoint [-q] [-d] /path/to/directory
       /bin/mountpoint -x /dev/device

Apparemment, cela vient avec le paquet sysvinit, je ne sais pas si cette commande est disponible sur d’autres systèmes.

[root@myhost~]# rpm -qf $(which mountpoint)
sysvinit-2.86-17
51
Andrea Francia

Ne pas s'appuyer sur mount, /etc/mtab, /proc/mounts, etc.:

if [ `stat -c%d "$dir"` != `stat -c%d "$dir/.."` ]; then
    echo "$dir is mounted"
else
    echo "$dir is not mounted"
fi

Lorsque $dir est un point de montage, son numéro de périphérique est différent de celui de son répertoire parent.

L'avantage par rapport aux alternatives énumérées jusqu'à présent est que vous n'avez pas à analyser quoi que ce soit, et que c'est correct si dir=/some//path/../with///extra/components.

L'inconvénient est qu'il ne marque pas / en tant que point de montage. Eh bien, c'est assez facile à un cas spécial, mais quand même.

20
ephemient

En utilisant GNU find 

find <directory> -maxdepth 0 -printf "%D" 

donnera le numéro de périphérique du répertoire. S'il diffère entre Le répertoire et son parent, vous avez un point de montage.

Ajouter /. sur le nom du répertoire si vous souhaitez que les liens symboliques vers différents systèmes de fichiers comptent comme points de montage (vous le voudrez toujours pour le parent).

Inconvénients: les utilisations GNU sont donc moins portables

Avantages: Indique les points de montage non enregistrés dans/etc/mtab. 

4
William Hay
if mount | cut -d ' ' -f 3 | grep '^/mnt/disk$' > /dev/null ; then
   ...
fi

EDIT: utilisé l'idée de Bombe d'utiliser cut.

3
haggai_e
df $path_in_question | grep " $path_in_question$"

Ceci définira $? à la fin.

3
chaz
for mountedPath in `mount | cut -d ' ' -f 3`; do
    if [ "${mountedPath}" == "${wantedPath}" ]; then
        exit 0
    fi
done
exit 1
2
Bombe
mount | awk '$3 == "/pa/th" {print $1}'

Vide si ce n'est pas un point de montage ^^

0
Igor

stat --printf '% m' montre le point de montage d'un fichier ou d'un répertoire donné.

realpath convertit les chemins relatifs en direct.

La comparaison des résultats des deux vous dira si un répertoire est un point de montage. stat est très portable. realpath moins, mais cela n’est nécessaire que si vous souhaitez vérifier les chemins relatifs.

Je ne sais pas comment portable point de montage est.

if [ "$(stat --printf '%m' "${DIR}")" = "$(realpath "${DIR}")" ]; then
    echo "This directory is a mount point."
else
    echo "This is not a mount point."
fi

Sans pour autant realpath:

if [  "${DIR}" = "$(stat --printf '%m' "${DIR}")" ]; then
    echo "This directory is a mount point."
else
    echo "This is not a mount point."
fi
0
Pedro

Voici une variante avec "df -P" supposée portable: 

mat@owiowi:/tmp$ f(){ df -P  | awk '{ if($6 == "'$1'")print   }' ; }
mat@owiowi:/tmp$ f /
/dev/mapper/lvm0-vol1  20642428  17141492   2452360      88% /
mat@owiowi:/tmp$ f /mnt
mat@owiowi:/tmp$ f /mnt/media
/dev/mapper/lvm0-media  41954040  34509868   7444172      83% /mnt/media
0
MatthieuP