Как проверить, является ли данный путь точкой монтирования - PullRequest
34 голосов
/ 26 января 2009

Предположим, вы хотите проверить, является ли / mnt / disk точкой монтирования в скрипте оболочки. Как ты это делаешь?

Ответы [ 10 ]

52 голосов
/ 27 января 2009

Я обнаружил, что на моем Fedora 7 есть команда точки монтирования.

С точки подключения человека:

NAME
       mountpoint - see if a directory is a mountpoint

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

По всей видимости, он поставляется с пакетом sysvinit, я не знаю, доступна ли эта команда в других системах.

[root@myhost~]# rpm -qf $(which mountpoint)
sysvinit-2.86-17
20 голосов
/ 28 января 2009

Не полагаясь на mount, /etc/mtab, /proc/mounts и т. Д.:

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

Когда $dir - это точка монтирования, она имеет номер устройства, отличный от родительского каталога.

Преимущество по сравнению с перечисленными альтернативами состоит в том, что вам не нужно ничего анализировать, и это правильно, если dir=/some//path/../with///extra/components.

Недостатком является то, что он не помечает / как точку монтирования. Ну, это достаточно просто для особого случая, но все же.

4 голосов
/ 26 января 2009

Используя GNU find

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

даст номер устройства каталога. Если это отличается между каталог и его родитель, то у вас есть точка монтирования.

Добавить /. на имя каталога, если вы хотите, чтобы символические ссылки на разные файловые системы считать как точки монтирования (вы всегда будете хотеть это для родителя).

Недостатки: использует GNU, чтобы найти менее переносимым

Преимущества: Точки монтирования отчетов не записаны в / etc / mtab.

3 голосов
/ 13 декабря 2012

К сожалению, и точка монтирования, и stat будут иметь побочный эффект MOUNTING каталога, который вы тестируете, если используете автомонтирование. Или, по крайней мере, для меня в Debian используется автоматический cif для сетевого диска WD MyBookLive. Я закончил с вариантом / proc / mounts, который стал более сложным, потому что каждое POTENTIAL монтирование уже находится в / proc / mounts, даже если оно на самом деле не смонтировано!

cut -d ' ' -f 1 < /proc/mounts | grep -q '^//disk/Public$' && umount /tmp/cifs/disk/Public
Where
   'disk' is the name of the server (networked disk) in /etc/hosts.
   '//disk/Public' is the cifs share name
   '/tmp/cifs' is where my automounts go (I have /tmp as RAM disk and / is read-only)
   '/tmp/cifs/disk' is a normal directory created when the server (called 'disk') is live.
   '/tmp/cifs/disk/Public' is the mount point for my 'Public' share.
3 голосов
/ 27 января 2009
df $path_in_question | grep " $path_in_question$"

Это установит $? после завершения.

3 голосов
/ 26 января 2009
if mount | cut -d ' ' -f 3 | grep '^/mnt/disk$' > /dev/null ; then
   ...
fi

РЕДАКТИРОВАТЬ: Использовал идею Bombe использовать Cut.

2 голосов
/ 26 января 2009
for mountedPath in `mount | cut -d ' ' -f 3`; do
    if [ "${mountedPath}" == "${wantedPath}" ]; then
        exit 0
    fi
done
exit 1
0 голосов
/ 13 мая 2018

stat --printf '% m' показывает точку монтирования данного файла или каталога.

realpath преобразует относительные пути в прямые.

Сравнение результатов обоих покажет вам, является ли каталог точкой монтирования. stat очень переносимый. realpath меньше, но он необходим, только если вы хотите проверить относительные пути.

Я не уверен, насколько портативна точка монтирования .

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

без 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 голосов
/ 26 февраля 2015
mount | awk '$3 == "/pa/th" {print $1}'

Пусто, если не точка монтирования ^^

0 голосов
/ 26 января 2009

Вот вариант с "df -P", который должен быть переносимым:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...