No * nix, como determinar em qual sistema de arquivos um determinado arquivo está?

12

Em um ambiente unix moderno e genérico (digamos, GNU / Linux, GNU / Solaris ou Mac OS X), há uma boa maneira de determinar em qual ponto de montagem e tipo de sistema de arquivos um caminho absoluto de arquivo está?

Suponho que eu poderia executar o comando mount e analisar manualmente a saída disso e comparar com o caminho do meu arquivo, mas antes disso eu estou querendo saber se há mais maneira elegante.

Estou desenvolvendo um script BASH que faz uso de atributos estendidos e quer fazer com que faça a coisa certa (na medida do possível) para uma variedade de sistemas de arquivos e ambientes host.

    
por smokris 18.09.2009 / 00:36

7 respostas

19

O comando df(1) recebe um ou mais argumentos e retorna o ponto de montagem e o dispositivo no qual esse arquivo ou diretório existe, bem como informações de uso. Você pode então usar o caminho ou dispositivo para procurar o tipo de sistema de arquivos na saída de mount -v ou similar.

Infelizmente, o formato de saída de df e mount depende do sistema; não há padrão aparente, pelo menos como eu posso ver entre Solaris, NetBSD e Mac OS X.

    
por 18.09.2009 / 01:03
7

Você pode usar o status . O comando stat --printf '% d' filename.txt retornará o número do dispositivo como hexadecimal / decimal.

    
por 18.09.2009 / 00:46
3

Para apenas um arquivo específico, é tão fácil quanto

df -T "${FILE}" | awk '{print $2}' | tail -n1
    
por 19.03.2013 / 15:28
2

Para o ponto de montagem, você pode subir na hierarquia até que o st_dev seja alterado (então você acabou de cruzar um limite de montagem); há% GNUstat para scripts bash; no entanto, não sei como você pode adivinhar o tipo de sistema de arquivos sem analisar /proc/mounts ou por tentativa e erro (ou seja, lidar com falhas depois de definir atributos estendidos)

    
por 18.09.2009 / 00:47
2

Uma pegadinha com o uso de df é que, se o nome do dispositivo na saída for longo, a linha será agrupada, portanto você não poderá simplesmente pegar a última linha. Em vez disso, retire a primeira linha e, em seguida, pegue a nova primeira 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
    
por 22.12.2009 / 02:10
2

Parece haver um problema com o df e o btrfs no Linux. Quando você solicita ao df para localizar o ponto de montagem de um volume btrfs montado, ele fará a coisa certa. 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 que está sendo referenciado for um sub-volume, ele não informará mais o ponto de montagem.

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

O / a / whale / backup é o único ponto de montagem de acordo com o kernel.

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

FWIW, stat faz a mesma coisa:

# stat --printf '%m\n' /srv/backup/joe/code
/a/whale/backup/joe/code
    
por 19.05.2015 / 22:21
1

De link :

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

funciona em todos os lugares que testei, tanto para * BSDs como para sysVs, e para diretórios montados em wacky. Eu ficaria muito feliz em saber de um caso em que ele falha.

    
por 08.02.2010 / 15:31