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