Em * nix, como determinair qual sistema de files um determinado file está ativado?

Em um ambiente unix genérico e moderno (digamos, GNU / Linux, GNU / Solairis ou Mac OS X), existe uma boa maneira de determinair qual ponto de assembly e tipo de sistema de files um path de file absoluto específico está ativado?

Suponho que eu poderia executair o command mount e, manualmente, analisair a saída daquilo e fazer uma string – compairá-lo com meu path de file, mas antes de fazer isso, estou me perguntando se há uma maneira mais elegante.

Estou desenvolvendo um script BASH que faz uso de attributes estendidos e quer fazê-lo Do The Right Thing (na menor medida que é possível) paira uma vairiedade de filesystems e ambientes de host.

O command df(1) leva um ou mais airgumentos e retornairá o ponto de assembly e o dispositivo no qual esse file ou diretório existe, bem como informações de uso. Você pode então usair o path ou dispositivo paira procurair o tipo de sistema de files na saída de mount -v ou similair.

Infelizmente, o format de saída de df e mount é dependente do sistema; não há um padrão apairente, pelo less como vejo entre o Solairis, NetBSD e Mac OS X.

Você poderia usair o stat . O command stat –printf '% d' filename.txt retornairá o número do dispositivo como hex / decimal.

Por apenas um file específico, é tão fácil quanto

 df -T "${FILE}" | awk '{print $2}' | tail -n1 

Hm. Paira o ponto de assembly, você pode subir a hierairquia até o st_dev mudair (então você acabou de atravessair um limite de assembly); há stat do GNU paira scripts bash; No entanto, não sei como você pode adivinhair o tipo de sistema de files sem analisair /proc/mounts ou por tentativa e erro (ou seja, lidair com crashs após a configuration de attributes estendidos)

Um com o uso de df é que, se o nome do dispositivo na saída for longo, a linha irá embrulhair paira que você não consiga apenas pegair a última linha. Em vez disso, retire a primeira linha e depois pegue a nova linha e, em seguida, imprima o primeiro campo:

 #!/usr/bin/env bash path=$1 curdir=$(pwd) cd $path df . | tail -n +2 | head -1 | awk '{print $1}' cd $curdir 

De https://stackoviewflow.com/questions/2167558/give-the-mount-point-of-a-a-path :

  df -P $path | tail -1 | awk '{ print $NF}' 

funciona em todos os lugaires que testei, tanto paira * BSDs quanto paira sysVs, e paira diretórios automáticos malucos. Eu ficairia encantado de ouvir um caso em que ele falhou.

Pairece haview uma captura com df e btrfs no Linux. Quando você pergunta ao df paira localizair o ponto de assembly paira um volume montado btrfs, ele fairá o que é certo. Neste caso, joe é um subdiretório de / m / whale / backup.

 # df /srv/backup/joe Filesystem 1K-blocks Used Available Use% Mounted on /dev/md126 2930135488 307676684 2619663252 11% /m/whale/backup 

Mas se o diretório a ser referenciado for um sub-volume, não lhe dire o ponto de assembly.

 # df /srv/backup/joe/code Filesystem 1K-blocks Used Available Use% Mounted on - 2930135488 307676684 2619663252 11% /a/whale/backup/joe/code 

O / a / baleia / backup é o único ponto de assembly de acordo com o kernel.

 # mount | grep whale /dev/md126 on /a/whale/backup type btrfs (rw,relatime,space_cache) 

FWIW, stat faz o mesmo:

 # stat --printf '%m\n' /srv/backup/joe/code /a/whale/backup/joe/code