Відповіді:
Як каже Стефан, "у цьому немає універсальної відповіді 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" (локальні та 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 системах.
Від man df :
-t, --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
.