Risposte:
Come dice Stephane "non esiste una risposta universale a Unix".
La migliore soluzione che ho trovato alla mia domanda:
df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'
restituirà il tipo di filesystem, ad esempio: nfs
o ext3
.
L' -T
opzione non è standard , quindi potrebbe non funzionare su altri sistemi Unix / Linux ...
Secondo il commento di Gilles di seguito: "Funziona su qualsiasi Linux non incorporato, ma non su BusyBox, * BSD, ecc."
/etc/mtab
o i risultati mount
anziché utilizzare df
potrebbero essere utili in alcuni casi.
/proc/mounts
mount
, né /etc/mtab
, nemmeno /proc/mounts
sono standard quindi non c'è garanzia su cosa si possa trovare lì ...
-T
ha un significato diverso
Puoi usare GNU stat
.
%m
per scoprire il mountpoint.
$ stat --format=%m /usr/src/linux
/usr/src
%T
(in modalità file system) per scoprire il nome del file system.
$ stat --file-system --format=%T /usr/src/linux
reiserfs
Quindi sai che /usr/src/linux
, sul mio sistema, è memorizzato in un filesystem che è montato /usr/src
e ha il tipo di filesystem reiserfs
.
Fare riferimento anche man stat
per ulteriori riferimenti. È un comando molto versatile, utile quasi sempre quando hai bisogno di informazioni sui file e non vuoi tornare al grep | awk
reparto.
stat
non ha l' %m
opzione per --format
(usando Debian Squeeze, coreutils 8.5). Quindi, suppongo che questa soluzione non sia molto affidabile.
2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file
. Sono passati quasi 3 anni. Incredibile che Debian non abbia ancora questo.
mount -l
e utilizzare grep
, sed
oppure awk
per trovare la riga che fa riferimento alla directory in questione.
/my/path/to/the/directory
realtà è qualcosa dal mountpoint /my/path
con la tua risposta. Forse si può dare qualche dettaglio in più sul grep
, sed
, awk
comandi suggerire (una risposta completa) ?.
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'
dovrebbe darti un elenco di tutti i mountpoint di nfs sul sistema.
mount | fgrep "`stat --printf=" on %m type" /var/log/`". The
comando stat: mount` stamperà tutti i punti di mount, nel <device> on <mountpoint> type <type>
formato. Per grep questo, ho stat --printf
generato la on <mountpoint> type
parte.
Sfortunatamente, non esiste una risposta universale a Unix.
Una cosa che puoi fare, per un dato file /a/b/c/d
è percorrere il percorso:
... e fai un stat(2)
a ogni livello, fino a quando le st_dev
modifiche. Quindi saprai dove si trova il punto di montaggio. Quindi puoi cercare il percorso canonico di quel punto di mount all'interno /etc/mtab
o nell'output di mount
per scoprire il tipo di file system. Quindi scoprire cosa è remoto e cosa non lo sarà sarà difficile soprattutto per quelli di tipo a miccia. Per esempio, nfs
, cifs
, fuse.sshfs
, fuse.davfs
sono evidenti, ma per quanto riguarda per esempio fuse.gvfs-fuse-daemon
o fuse.avfsd
che possono avere entrambe le file di rete e non in rete?
stat(2)
, penso che stai facendo riferimento alla funzione C, ma sto usando shell. Tuttavia, st_dev
fa riferimento all'ID dispositivo principale e secondario (è specifico di Linux?) E il comando shell stat(1)
ha (non standard) %t
e %T
con le --format
opzioni per i numeri rispettivamente maggiore e minore, ma restituisce sempre "0" (local e nfs ). Ho provato Debian Squeeze e Lenny.
--file-system
opzione?
--file-system
.
Il "-l" a df (1) fallirà con un errore sui filesystem non locali, quindi puoi usare questo comportamento per sapere se il filesystem è remoto:
df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
echo "local mount, do stuff"
fi
df
molti altri motivi per cui fallirebbe e questo da solo rende questa una risposta non molto buona, ma sta cercando di rispondere alla domanda, quindi non vedo perché la chiameresti "non una risposta".
È possibile utilizzare i df -t
sistemi Linux e df -T
BSD.
Da man df :
-t, --type = TYPE
limitare l'elenco ai file system di tipo TYPE
if df -t nfs | grep -q /path/to/folder$; then
# it is an NFS
fi
-t
opzione ha un significato diverso in POSIX / SUS. Pertanto, l'utilizzo di questa opzione può fornire risultati incoerenti in diverse versioni sullo strumento / UNIX.
Personalmente userei mountpoint
(molto portatile su Linux!):
NAME
mountpoint - see if a directory is a mountpoint
SYNOPSIS
mountpoint [-d|-q] directory
o showmount
che è praticamente necessario installare su qualsiasi sistema che effettivamente monta NFS
condivisioni (parte del nfs-common
pacchetto):
NAME
showmount - show mount information for an NFS server
SYNOPSIS
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
Un'altra opzione sarebbe qualcosa del tipo:
$ mount -l -t nfs | grep 'my mount point'
mountpoint
utilità non ti dice se il punto di montaggio è remoto. Inoltre, i filesystem remoti non si limitano ai filesystem NFS. Infine, mountpoint
non è standard (non in questo elenco ).
mountpoint
in questo caso è standard.
find . -type d -name nfs -exec mountpoint {} \; | grep not
controllerà tutte le cartelle denominate 'nfs' se sono montate
nfs
.