En un entorno genérico y moderno de Unix (por ejemplo, GNU / Linux, GNU / Solaris o Mac OS X), ¿hay una buena manera de determinar en qué punto de montaje y tipo de sistema de archivos se encuentra una ruta de archivo absoluta particular?
Supongo que podría ejecutar el mount
comando y analizar manualmente la salida de eso y compararlo con la ruta de mi archivo, pero antes de hacerlo me pregunto si hay una forma más elegante.
Estoy desarrollando un script BASH que hace uso de atributos extendidos y quiero que haga lo correcto (en la medida de lo posible) para una variedad de sistemas de archivos y entornos host.
fuente
df -P
debería producir resultados estandarizados en cualquier sistema compatible con POSIX. Algunos sistemas más tontos pueden requerir una variable de entorno mágico, como POSIXLY_CORRECT, para configurarse también.df /path-to-the-directory
le dará la partición que contiene ese directorioPodrías usar stat . El comando stat --printf '% d' filename.txt devolverá el número del dispositivo como hexadecimal / decimal.
fuente
stat --printf "%d"
le indica el número menor de un dispositivo, pero hay más trabajo por hacer para obtener el nombre del dispositivo y su sistema de archivos montado.stat --format '%m' $file
le dará el punto de montaje ystat --file-system --format '%T' $mount
le proporcionará el nombre del tipo de sistema de archivos.Solo por un archivo específico es tan fácil como
fuente
Hm. Para el punto de montaje, puede subir la jerarquía hasta que cambie st_dev (luego acaba de cruzar un límite de montaje); hay GNU
stat
para scripts de bash; sin embargo, no sé cómo puede adivinar el tipo de sistema de archivos sin analizar/proc/mounts
o por prueba y error (es decir, manejar fallas después de establecer atributos extendidos)fuente
Un problema con el uso
df
es que si el nombre del dispositivo en la salida es largo, su línea se ajustará, por lo que no puede tomar la última línea. En su lugar, elimine la primera línea y luego tome la nueva primera línea y luego imprima el primer campo:fuente
Parece que hay un problema con df y btrfs en Linux. Cuando le pide a df que ubique el punto de montaje para un volumen btrfs montado, hará lo correcto. En este caso, Joe es un subdirectorio de / m / whale / backup.
Pero si el directorio al que se hace referencia es un subvolumen, ya no le indicará el punto de montaje.
El / a / whale / backup es el único punto de montaje según el núcleo.
FWIW, stat hace lo mismo:
fuente
Desde /programming/2167558/give-the-mount-point-of-a-path :
funciona en todos los lugares que he probado, tanto para * BSD como para sysV y para directorios automáticos extravagantes. Me encantaría saber de un caso en el que falla.
fuente
os.path.splitunc()
solo funciona para rutas UNC y solo está disponible en Windows .