¿Cómo puedo verificar si /my/direstá 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
statcomando 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
-Popció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
dfsalida en este caso.Debajo del capó, puede identificar el sistema de archivos que contiene un archivo por el
st_devcampo devuelto porstat. No hay una forma portátil de hacer esto desde un script de shell. Algunos sistemas tienen unastatutilidad, pero su sintaxis varía:statinforma elst_devcampo cuando se invoca comostat -c %D -- "$file".statque es compatible con GNU coreutils. Otros tienenstatsin la%copció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 lastatsalida.statutilidad diferente que requierestat -f %d -- "$file".statutilidad.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,/fooy/barse 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
dfno 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-583327b48fb4lo quedfno es fiable. La única opción confiable hasta ahora es utilizar unastatsolución basada en.dfinforme para el dispositivo, es coherente entre las dos invocaciones, por lo que está bien para una comparación.dfinforme/dev/sda6y/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 /mnt1seguido demount /dev/sda6 /mnt2trabajos como un encanto.cat /proc/mountsestá bien con eso. Sin embargo, solo desde Wheezy/dev/disk/by-uuid/ca09b...se muestradfcomo 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/sda6endf(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
dfes 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