Как я могу проверить, /my/dir
находится ли на том же разделе, что и /
?
Это для интеграции внутри скрипта. Крепления должны быть обработаны правильно. POSIX-совместимые решения приветствуются.
shell-script
mount
Totor
источник
источник
Ответы:
Вы можете проверить это с помощью stat:
Показывает номер устройства и где был установлен ваш каталог.
источник
stat
оболочки не POSIX ...Следующая команда дает уникальное имя для точки монтирования, содержащей файл
$file
:Это работает в любой системе POSIX .
-P
Вариант предусматривает предсказуемый формат; первое поле второй строки - это «имя файловой системы». Таким образом, для проверки два файла находятся в одной точке монтирования:Или, чтобы сохранить пару вызовов процесса:
Некоторые операционные системы могут иметь пробелы в именах томов. В этом случае нет абсолютно надежного способа анализа
df
выходных данных.Под капотом вы можете идентифицировать файловую систему, содержащую файл, по
st_dev
полю, возвращаемомуstat
. Нет переносимого способа сделать это из сценария оболочки. В некоторых системах естьstat
утилита, но ее синтаксис различен:stat
сообщаетst_dev
поле при вызове какstat -c %D -- "$file"
.stat
который совместим с GNU coreutils. Другие имеютstat
без%c
опции; Вы можете использовать,stat -t -- "$file" | awk '{print $8}'
но это работает только в том случае, если имя файла не содержит пробелов, илиstat -t -- "$file" | awk 'END {print $(NF-8)}'
которое справляется с произвольными именами файлов, но не с будущими добавлениями полей кstat
выводу.stat
утилиту, которая требуетstat -f %d -- "$file"
.stat
полезности.Если Perl доступен, вы можете использовать
и сделать сравнение:
Обратите внимание, что в некоторых угловых случаях желаемый результат неясен. Например, с помощью связывания креплений для Linux, после того, как
mount --bind /foo /bar
,/foo
и/bar
считаются одной файловой системой. Всегда возможно, что эти два файла фактически расположены на одном устройстве, но вы никогда не узнаете: например, если файлы находятся на двух разных сетевых подключениях, клиент не сможет узнать, экспортирует ли сервер разные файловые системы.Если файлы являются каталогами, и вы можете записать в них, другой метод - создать временный файл и попытаться создать жесткую ссылку. Этот отчет сообщает об отрицательном результате при использовании Linux bind mounts.
источник
df
не всегда дает имя устройства, но иногда символическая ссылка на него, например,/dev/disk/by-uuid/ca09b761-ae1b-450f-8a46-583327b48fb4
делаетdf
не надежным. Пока единственным надежным вариантом является использованиеstat
решения на основе.df
сообщалось для устройства, оно согласовано между двумя вызовами, поэтому для сравнения все в порядке.df
отчет/dev/sda6
и/dev/disk/by-uuid/ca09b...
, оба ссылаются на одно и то же устройство, но разные точки монтирования. При сравнении файлов из каждой точки монтирования проверка сравнения строк явно не проходит.mount /dev/sda6 /mnt1
за ним следуетmount /dev/sda6 /mnt2
работа, как шарм.cat /proc/mounts
хорошо с этим. Тем не менее, только с тех пор, как Wheezy/dev/disk/by-uuid/ca09b...
отображаетсяdf
как устройство для корневой файловой системы. Дальнейшие попытки установить его с помощью этого SimLink илиUUID=ca09b...
смонтировать синтаксис не до конца , показывая что - нибудь еще , чем/dev/sda6
вdf
(я не знаю , как воспроизвести то , что это было сделано во время процесса загрузки, но это не забота здесь).Работает с любым количеством путей.
источник
df
является не всегда хорошей идеей .$6
), а не имя устройства ($1
), так что это не должно быть проблемой.Лучшее надежное решение, доступное в POSIX, - это сравнение файловых идентификаторов устройств, предоставляемых функцией stat (2) .
Perl имеет аналогичную функцию stat, как указал Жиль :
но «способ POSIX» заключается в использовании программы на C, например:
какой исходный код выглядит следующим образом:
Если идентификаторы устройств обоих файлов совпадают, они размещаются в одной файловой системе, и в этом случае приведенные выше команды возвращают 0 (другое значение в противном случае). Проверьте с
echo $?
.Это хорошо работает с bind mounts, но, вероятно, не с сетевыми подключениями.
источник