¿Cómo puedo verificar si /my/dir
está en la misma partición que /
?
Esto es para la integración dentro de un script. Los montajes de unión deben manejarse correctamente. Las soluciones compatibles con POSIX son bienvenidas.
shell-script
mount
Totor
fuente
fuente
Respuestas:
Puede verificar esto con stat:
Muestra el número de dispositivo y dónde se montó su directorio.
fuente
stat
comando de shell no es POSIX ...El siguiente comando proporciona un nombre único para el punto de montaje que contiene el archivo
$file
:Esto funciona en cualquier sistema POSIX . La
-P
opción impone un formato predecible; El primer campo de la segunda línea es el "nombre del sistema de archivos". Por lo tanto, para verificar dos archivos están bajo el mismo punto de montaje:O, para guardar un par de invocaciones de procesos:
Algunos sistemas operativos pueden tener espacios en los nombres de volumen. No hay una forma completamente confiable de analizar la
df
salida en este caso.Debajo del capó, puede identificar el sistema de archivos que contiene un archivo por el
st_dev
campo devuelto porstat
. No hay una forma portátil de hacer esto desde un script de shell. Algunos sistemas tienen unastat
utilidad, pero su sintaxis varía:stat
informa elst_dev
campo cuando se invoca comostat -c %D -- "$file"
.stat
que es compatible con GNU coreutils. Otros tienenstat
sin la%c
opción; puede usarlo,stat -t -- "$file" | awk '{print $8}'
pero esto solo funciona si el nombre del archivo no contiene espacios en blanco, o sistat -t -- "$file" | awk 'END {print $(NF-8)}'
hace frente a nombres de archivo arbitrarios pero no a futuras adiciones de campos a lastat
salida.stat
utilidad diferente que requierestat -f %d -- "$file"
.stat
utilidad.Si Perl está disponible, puede usar
y para hacer la comparación:
Tenga en cuenta que hay algunos casos de esquina donde el resultado deseado no está claro. Por ejemplo, con los montajes de enlace de Linux, after
mount --bind /foo /bar
,/foo
y/bar
se consideran el mismo sistema de archivos. Siempre es posible que los dos archivos estén ubicados en el mismo dispositivo, pero nunca lo sabrá: por ejemplo, si los archivos están en dos montajes de red diferentes, el cliente no tiene forma de saber si el servidor está exportando diferentes sistemas de archivos.Si los archivos son directorios y puede escribir en ellos, otro método es crear un archivo temporal e intentar crear un enlace rígido. Este informa un resultado negativo en los montajes de enlace de Linux.
fuente
df
no siempre da el nombre del dispositivo, pero en algún momento un enlace simbólico a ella como/dev/disk/by-uuid/ca09b761-ae1b-450f-8a46-583327b48fb4
lo quedf
no es fiable. La única opción confiable hasta ahora es utilizar unastat
solución basada en.df
informe para el dispositivo, es coherente entre las dos invocaciones, por lo que está bien para una comparación.df
informe/dev/sda6
y/dev/disk/by-uuid/ca09b...
, ambos se refieren al mismo dispositivo, pero diferentes puntos de montaje. La prueba de comparación de cadenas obviamente falla al intentar con archivos de cada punto de montaje.mount /dev/sda6 /mnt1
seguido demount /dev/sda6 /mnt2
trabajos como un encanto.cat /proc/mounts
está bien con eso. Sin embargo, solo desde Wheezy/dev/disk/by-uuid/ca09b...
se muestradf
como el dispositivo para el sistema de archivos raíz. Los intentos adicionales de montarlo usando este enlace simbólico o laUUID=ca09b...
sintaxis de montaje no terminan mostrando nada más que/dev/sda6
endf
(no sé cómo reproducir lo que hizo durante el proceso de arranque, pero esa no es la preocupación aquí).Funciona con cualquier número de caminos.
fuente
df
es no siempre una buena idea .$6
), no el nombre del dispositivo ($1
), por lo que no debería ser un problema.La mejor solución infalible disponible en POSIX es la comparación de las ID de dispositivo de los archivos proporcionadas por la función stat (2) .
Perl tiene una función estadística similar a la que Gilles señaló :
pero la "forma POSIX" es usar un programa en C como:
cuyo código fuente es el siguiente:
Si las ID de dispositivo de ambos archivos son iguales, se alojan en el mismo sistema de archivos, en cuyo caso, los comandos anteriores devuelven 0 (de lo contrario, otro valor). Consulte con
echo $?
.Esto funciona bien con los montajes de enlace, pero probablemente no lo hará con los montajes de red.
fuente