Ответы:
Как говорит Стефан, «нет универсального ответа Unix на это».
Лучшее решение, которое я нашел на мой вопрос:
df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'
вернет тип файловой системы, например: nfs
или ext3
.
Эта -T
опция не является стандартной , поэтому она может не работать на других системах Unix / Linux ...
Согласно приведенному ниже комментарию Жиля : «Это работает на любом не встроенном Linux, но не на BusyBox, * BSD и т. Д.»
/etc/mtab
или результаты mount
вместо использования df
могут сделать в некоторых других случаях.
/proc/mounts
mount
, ни /etc/mtab
, ни даже не /proc/mounts
являются стандартными, поэтому нет никакой гарантии, что там можно найти ...
-T
имеют другое значение
Вы могли бы использовать GNU stat
.
%m
выяснить точку монтирования.
$ stat --format=%m /usr/src/linux
/usr/src
%T
(в режиме файловой системы), чтобы узнать имя файловой системы.
$ stat --file-system --format=%T /usr/src/linux
reiserfs
Таким образом, вы знаете, что /usr/src/linux
в моей системе хранится в файловой системе, которая смонтирована /usr/src
и имеет тип файловой системы reiserfs
.
Также обратитесь к man stat
для дальнейшей ссылки. Это очень универсальная команда, полезная почти всегда, когда вам нужна информация о файлах и вы не хотите возвращаться к grep | awk
безопасности.
stat
не имеет %m
опции для --format
(используя Debian Squeeze, coreutils 8.5). Итак, я думаю, это решение не очень надежно.
2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file
. Это почти 3 года назад. Удивительно, что Debian до сих пор не имеет этого.
mount -l
и используйте grep
, sed
или, awk
чтобы найти строку, которая относится к рассматриваемому каталогу.
/my/path/to/the/directory
это действительно что-то из точки монтирования /my/path
с вашим ответом. Может быть , вы можете дать некоторые дополнительные детали о grep
, sed
, awk
команду вы предлагаете (полный ответ) ?.
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'
должен дать вам список всех точек монтирования nfs в системе.
mount | fgrep "`stat --printf=" on %m type" /var/log/`". The
командой stat: mount`, которая напечатает все точки монтирования в <device> on <mountpoint> type <type>
формате. Чтобы понять это, я должен stat --printf
создать on <mountpoint> type
часть.
К сожалению, нет универсального ответа Unix на это.
Единственное, что вы можете сделать для данного файла, /a/b/c/d
это пройти путь:
... и делать stat(2)
на каждом уровне, до st_dev
изменений. Тогда вы будете знать, где находится точка монтирования. Затем вы можете найти канонический путь этой точки монтирования в /etc/mtab
или в выходных данных, mount
чтобы узнать тип файловой системы. Тогда выяснить, что удаленно, а что нет, будет непросто, особенно для предохранителей. Так , например, nfs
, cifs
, fuse.sshfs
, fuse.davfs
очевидны, но как, например , fuse.gvfs-fuse-daemon
или fuse.avfsd
которые могут иметь как сетевые и несетевые файлы?
stat(2)
, я думаю, что вы ссылаетесь на функцию C, но я использую shell. Тем не менее, st_dev
относится к старшему и второстепенному идентификатору устройства (это специфично для Linux?), А команда оболочки stat(1)
имеет (нестандартный) %t
и %T
с --format
параметрами для соответственно старшего и младшего номеров, но всегда возвращает «0» (local и nfs) ). Я примерял Debian Squeeze и Lenny.
--file-system
опции?
--file-system
.
От -l к df (1) завершится с ошибкой в нелокальных файловых системах, поэтому вы можете использовать это поведение, чтобы узнать, удалена ли файловая система:
df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
echo "local mount, do stuff"
fi
Однако этот -l
вариант не является стандартным .
df
бы не получиться, и это само по себе делает это не очень хорошим ответом, но он пытается ответить на вопрос, поэтому я не понимаю, почему вы бы назвали это «не ответом».
Вы можете использовать df -t
на Linux и df -T
на системах BSD.
От человека Д.Ф . :
-t, --type = TYPE
ограничить перечисление файловыми системами типа TYPE
if df -t nfs | grep -q /path/to/folder$; then
# it is an NFS
fi
-t
опция имеет другое значение в POSIX / SUS. Таким образом, использование этой опции может привести к противоречивым результатам в разных версиях инструмента / UNIX.
Я бы лично использовал mountpoint
(очень переносимый в Linux!):
NAME
mountpoint - see if a directory is a mountpoint
SYNOPSIS
mountpoint [-d|-q] directory
или showmount
который в значительной степени требуется для установки в любой системе, которая фактически монтирует NFS
общие ресурсы (часть nfs-common
пакета):
NAME
showmount - show mount information for an NFS server
SYNOPSIS
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
Другим вариантом будет что-то вроде:
$ mount -l -t nfs | grep 'my mount point'
mountpoint
Утилита не скажет вам , если точка монтирования является маловероятной. Более того, удаленные файловые системы не ограничиваются файловыми системами NFS. Наконец, mountpoint
не является стандартным (нет в этом списке ).
mountpoint
является стандартным в этом случае.
find . -type d -name nfs -exec mountpoint {} \; | grep not
проверит все папки с именем 'nfs', если они смонтированы
nfs
.