Em um ambiente unix moderno e genérico (por exemplo, GNU / Linux, GNU / Solaris ou Mac OS X), existe uma boa maneira de determinar em qual ponto de montagem e tipo de sistema de arquivos está o caminho absoluto de um arquivo?
Suponho que eu poderia executar o mount
comando e analisar manualmente a saída disso e compará-lo com o caminho do arquivo, mas antes de fazer isso, fico imaginando se há uma maneira mais elegante.
Estou desenvolvendo um script BASH que utiliza atributos estendidos e quero fazê-lo fazer a coisa certa (na menor extensão possível) para uma variedade de sistemas de arquivos e ambientes host.
fonte
df -P
deve produzir saída padronizada em qualquer sistema compatível com POSIX. Alguns sistemas mais bobos podem exigir que uma variável de ambiente mágica, como POSIXLY_CORRECT, também seja definida.df /path-to-the-directory
lhe dará a partição que contém daquele diretórioVocê poderia usar stat . O comando stat --printf '% d' filename.txt retornará o número do dispositivo como hexadecimal / decimal.
fonte
stat --printf "%d"
informa o número menor de um dispositivo, mas há mais trabalho a ser feito para obter o nome do dispositivo e seu sistema de arquivos montado.stat --format '%m' $file
fornecerá o ponto de montagem estat --file-system --format '%T' $mount
fornecerá o nome do tipo de sistema de arquivos.Para apenas um arquivo específico, é tão fácil quanto
fonte
Hum. Para o ponto de montagem, você pode subir a hierarquia até que o st_dev mude (então você acabou de cruzar um limite de montagem); existe o GNU
stat
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 após definir atributos estendidos)fonte
Uma dica para o uso
df
é que, se o nome do dispositivo na saída for longo, a linha será quebrada, assim você não poderá simplesmente pegar a última linha. Em vez disso, retire a primeira linha, pegue a nova primeira linha e imprima o primeiro campo:fonte
Parece haver uma pegadinha com df e btrfs no Linux. Quando você pede ao df para localizar o ponto de montagem de um volume btrfs montado, ele fará a coisa certa. Nesse caso, joe é um subdiretório de / m / whale / backup.
Mas se o diretório que está sendo referenciado for um subvolume, ele não informará mais o ponto de montagem.
O / a / whale / backup é o único ponto de montagem de acordo com o kernel.
FWIW, stat faz a mesma coisa:
fonte
Em /programming/2167558/give-the-mount-point-of-a-path :
funciona em qualquer lugar que eu testei, para * BSDs e sysVs e para diretórios malucos montados automaticamente. Eu ficaria feliz em ouvir um caso em que ele falha.
fonte
os.path.splitunc()
funciona apenas para caminhos UNC e só está disponível no Windows .