Respuestas:
Como Stephane dice "no hay una respuesta universal de Unix a eso".
La mejor solución que he encontrado para mi pregunta:
df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'
devolverá el tipo de sistema de archivos, por ejemplo: nfs
o ext3
.
La -T
opción no es estándar , por lo que puede no funcionar en otros sistemas Unix / Linux ...
Según el comentario de Gilles a continuación: "Esto funciona en cualquier Linux no incorporado, pero no en BusyBox, * BSD, etc."
/etc/mtab
o los resultados de en mount
lugar de usar df
podrían funcionar en algunos casos más.
/proc/mounts
mount
, ni /etc/mtab
, ni siquiera /proc/mounts
son estándar, por lo que no hay garantía sobre lo que se puede encontrar allí ...
-T
tiene un significado diferente aquí
Podrías usar GNU stat
.
%m
para descubrir el punto de montaje.
$ stat --format=%m /usr/src/linux
/usr/src
%T
(en modo de sistema de archivos) para averiguar el nombre del sistema de archivos.
$ stat --file-system --format=%T /usr/src/linux
reiserfs
Por lo tanto, sabe que /usr/src/linux
, en mi sistema, está almacenado en un sistema de archivos que está montado /usr/src
y tiene el tipo de sistema de archivos reiserfs
.
Consulte también man stat
para más referencias. Es un comando muy versátil, útil casi siempre cuando necesita información sobre archivos y no desea volver a la grep | awk
protección.
stat
no tiene la %m
opción para --format
(usando Debian Squeeze, coreutils 8.5). Entonces, supongo que esta solución no es muy confiable.
2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file
. Eso fue hace casi 3 años. Es sorprendente que Debian todavía no tenga esto.
mount -l
y use grep
, sed
o awk
para buscar la línea que hace referencia al directorio en cuestión.
/my/path/to/the/directory
realidad es algo desde el punto de montaje /my/path
con su respuesta. Tal vez usted puede dar algunos detalles más sobre el grep
, sed
, awk
comandos sugieres (una respuesta completa) ?.
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'
debería darle una lista de todos los puntos de montaje nfs en el sistema.
mount | fgrep "`stat --printf=" on %m type" /var/log/`". The
comando mount` imprimirá todos los puntos de montaje, en <device> on <mountpoint> type <type>
formato. Para entender esto, he stat --printf
generado la on <mountpoint> type
parte.
Desafortunadamente, no hay una respuesta universal de Unix a eso.
Una cosa que puede hacer, para un archivo dado /a/b/c/d
es recorrer el camino:
... y hacer un stat(2)
en cada nivel, hasta que los st_dev
cambios. Entonces sabrás dónde está el punto de montaje. Luego puede buscar la ruta canónica de ese punto de montaje en /etc/mtab
o en la salida de mount
para averiguar el tipo de sistema de archivos. Entonces descubrir qué es remoto y qué no será complicado, especialmente para los de tipo fusible. Por ejemplo, nfs
, cifs
, fuse.sshfs
, fuse.davfs
son evidentes, pero ¿qué pasa, por ejemplo, fuse.gvfs-fuse-daemon
o fuse.avfsd
que pueden tener los dos archivos de la red y fuera de la red?
stat(2)
, creo que te estás refiriendo a la función C, pero estoy usando shell. Sin embargo, se st_dev
refiere a la identificación del dispositivo mayor y menor (¿es específico de Linux?), Y el comando de shell stat(1)
tiene (no estándar) %t
y %T
con las --format
opciones para números mayores y menores respectivamente, pero siempre devuelve "0" (local y nfs ) Probé con Debian Squeeze y Lenny.
--file-system
opción?
--file-system
.
El "-l" a df (1) fallará con un error en sistemas de archivos no locales, por lo que puede usar este comportamiento para saber si el sistema de archivos es remoto:
df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
echo "local mount, do stuff"
fi
df
fallaría y eso solo hace que esta sea una respuesta no muy buena, pero está tratando de responder la pregunta, así que no veo por qué la llamarías "no una respuesta".
Puede usar los df -t
sistemas Linux y df -T
BSD.
Del hombre df :
-t, --type = TYPE
limitar el listado a los sistemas de archivos de tipo TIPO
if df -t nfs | grep -q /path/to/folder$; then
# it is an NFS
fi
-t
opción tiene un significado diferente en POSIX / SUS. Por lo tanto, el uso de esta opción puede proporcionar resultados inconsistentes en diferentes versiones de la herramienta / UNIX.
Yo personalmente usaría mountpoint
(¡muy portátil en Linux!):
NAME
mountpoint - see if a directory is a mountpoint
SYNOPSIS
mountpoint [-d|-q] directory
o showmount
que se requiere instalar en cualquier sistema que realmente monte recursos NFS
compartidos (parte del nfs-common
paquete):
NAME
showmount - show mount information for an NFS server
SYNOPSIS
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
Otra opción sería algo así como:
$ mount -l -t nfs | grep 'my mount point'
mountpoint
utilidad no le dice si el punto de montaje es remoto. Además, los sistemas de archivos remotos no se limitan a los sistemas de archivos NFS. Finalmente, mountpoint
no es estándar (no está en esta lista ).
mountpoint
es estándar en este caso.
find . -type d -name nfs -exec mountpoint {} \; | grep not
comprobará todas las carpetas llamadas 'nfs' si están montadas
nfs
.