Ответы:
Как говорит Стефан, «нет универсального ответа 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.