Odpowiedzi:
Jak mówi Stephane „nie ma na to uniwersalnej odpowiedzi na Uniksa”.
Najlepsze rozwiązanie, jakie znalazłem w moim pytaniu:
df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'
zwróci typ systemu plików, na przykład: nfs
lub ext3
.
Ta -T
opcja nie jest standardowa , więc może nie działać na innych systemach Unix / Linux ...
Zgodnie z komentarzem Gillesa poniżej: „Działa to na każdym niewbudowanym Linuksie, ale nie na BusyBox, * BSD itp.”
/etc/mtab
lub wyniki mount
zamiast używania df
może zrobić w kilku innych przypadkach.
/proc/mounts
mount
, ani /etc/mtab
nawet nie /proc/mounts
są standardowe, więc nie ma gwarancji, co tam można znaleźć ...
-T
ma tutaj inne znaczenie
Możesz użyć GNU stat
.
%m
znaleźć punkt montowania.
$ stat --format=%m /usr/src/linux
/usr/src
%T
(w trybie systemu plików), aby znaleźć nazwę systemu plików.
$ stat --file-system --format=%T /usr/src/linux
reiserfs
W ten sposób wiesz, że /usr/src/linux
w moim systemie jest przechowywany w systemie plików, który jest zamontowany /usr/src
i ma typ systemu plików reiserfs
.
Zobacz także w celu man stat
uzyskania dalszych informacji. To bardzo wszechstronne polecenie, przydatne prawie zawsze, gdy potrzebujesz informacji o plikach i nie chcesz wracać do grep | awk
czujności.
stat
nie ma %m
opcji dla --format
(używając Debian Squeeze, coreutils 8.5). Myślę, że to rozwiązanie nie jest bardzo niezawodne.
2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file
. To prawie 3 lata temu. Zadziwiające, że Debian wciąż tego nie ma.
mount -l
i użyj grep
, sed
lub, awk
aby znaleźć wiersz, który odnosi się do danego katalogu.
/my/path/to/the/directory
pochodzi z punktu montowania /my/path
. Być może można dać trochę więcej szczegółów o grep
, sed
, awk
polecenia, które sugerują (pełną odpowiedź) ?.
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'
powinien dać ci listę wszystkich punktów montowania nfs w systemie.
mount | fgrep "`stat --printf=" on %m type" /var/log/`". The
mount`, aby wydrukować wszystkie punkty montowania, w <device> on <mountpoint> type <type>
formacie. Aby grep to, stat --printf
wygenerowałem on <mountpoint> type
część.
Niestety nie ma na to uniwersalnej odpowiedzi na Uniksa.
Jedną rzeczą, którą możesz zrobić, dla danego pliku /a/b/c/d
jest przejście ścieżką:
... i rób stat(2)
na każdym poziomie, aż do st_dev
zmian. Wtedy będziesz wiedział, gdzie jest punkt montowania. Następnie możesz wyszukać kanoniczną ścieżkę tego punktu montowania w /etc/mtab
lub na wyjściu, mount
aby znaleźć typ systemu plików. Następnie sprawdzenie, co jest zdalne, a co nie, będzie trudne, szczególnie w przypadku bezpieczników. Na przykład nfs
, cifs
, fuse.sshfs
, fuse.davfs
są oczywiste, ale co na przykład fuse.gvfs-fuse-daemon
lub fuse.avfsd
które mogą mieć zarówno plików sieciowych i niesieciowych?
stat(2)
, myślę, że odwołujesz się do funkcji C, ale używam powłoki. Jednak st_dev
odnosi się do dużych i małych identyfikator urządzenia (jest to specyficzne dla Linuksa?), A polecenie shell stat(1)
ma (niestandardowa) %t
i %T
z --format
opcji dla odpowiednio dużych i małych ilościach, ale zawsze zwraca wartość „0” (lokalny i NFS ). Próbowałem na Debian Squeeze i Lenny.
--file-system
opcją lub bez ?
--file-system
.
„-L” do df (1) zakończy się niepowodzeniem z błędem w nielokalnych systemach plików, więc możesz użyć tego zachowania, aby wiedzieć, czy system plików jest zdalny:
df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
echo "local mount, do stuff"
fi
Jednak -l
opcja nie jest standardowa .
df
miałoby się nie powieść, i to samo czyni z tego niezbyt dobrą odpowiedź, ale próbuje odpowiedzieć na pytanie, więc nie rozumiem, dlaczego nazwałbyś to „nie odpowiedzią”.
Możesz używać df -t
w systemie Linux i df -T
BSD.
Od man df :
-t, --type = TYPE
ogranicz listę do systemów plików typu TYPE
if df -t nfs | grep -q /path/to/folder$; then
# it is an NFS
fi
-t
opcja ta ma inne znaczenie w POSIX / SUS. Tak więc użycie tej opcji może zapewnić niespójne wyniki w różnych wersjach narzędzia / UNIX.
Osobiście użyłbym mountpoint
(bardzo przenośny w systemie Linux!):
NAME
mountpoint - see if a directory is a mountpoint
SYNOPSIS
mountpoint [-d|-q] directory
lub showmount
który jest prawie wymagany do zainstalowania w dowolnym systemie, który faktycznie montuje NFS
udziały (część nfs-common
pakietu):
NAME
showmount - show mount information for an NFS server
SYNOPSIS
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
Inną opcją byłoby coś takiego:
$ mount -l -t nfs | grep 'my mount point'
mountpoint
Narzędzie nie powiedzieć, czy punkt montowania jest znikome. Ponadto zdalne systemy plików nie są ograniczone do systemów plików NFS. Wreszcie mountpoint
nie jest standardem (nie na tej liście ).
mountpoint
w tym przypadku jest to standard.
find . -type d -name nfs -exec mountpoint {} \; | grep not
sprawdzi wszystkie foldery o nazwie „nfs”, jeśli są zamontowane
nfs
.