Назад | Перейти на главную страницу

В * nix, как определить, в какой файловой системе находится конкретный файл?

В общей современной среде unix (скажем, GNU / Linux, GNU / Solaris или Mac OS X) существует ли хороший способ определить, для какой точки монтирования и типа файловой системы находится конкретный абсолютный путь к файлу?

Я полагаю я мог выполнить mount command и вручную проанализируйте вывод этого и сравните его с моим путем к файлу, но прежде чем я это сделаю, мне интересно, есть ли более элегантный способ.

Я разрабатываю сценарий BASH, который использует расширенные атрибуты, и хочу, чтобы он работал правильно (в той небольшой степени, в которой это возможно) для различных файловых систем и сред хоста.

Команда df(1) принимает один или несколько аргументов и возвращает точку монтирования и устройство, на котором существует этот файл или каталог, а также информацию об использовании. Затем вы можете использовать путь или устройство для поиска типа файловой системы в выводе mount -v или похожие.

К сожалению, выходной формат обоих df и mount системно-зависимы; нет очевидного стандарта, по крайней мере, как я могу видеть между Solaris, NetBSD и Mac OS X.

Вы могли бы использовать стат. Команда stat --printf '% d' filename.txt вернет номер устройства в шестнадцатеричном / десятичном виде.

Для конкретного файла это так же просто, как

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

Одна проблема с использованием df заключается в том, что если имя устройства в выходных данных длинное, строка будет перенесена, поэтому вы не сможете просто захватить последнюю строку. Вместо этого удалите первую строку, затем возьмите новую первую строку и распечатайте первое поле:

#!/usr/bin/env bash

path=$1
curdir=$(pwd)
cd $path
df . | tail -n +2 | head -1 | awk '{print $1}'
cd $curdir

Хм. Для точки монтирования вы можете подниматься вверх по иерархии, пока st_dev не изменится (тогда вы только что пересекли границу монтирования); есть GNU stat для скриптов bash; однако я не знаю, как можно угадать тип файловой системы без разбора /proc/mounts или методом проб и ошибок (т.е. обрабатывать отказы после установки расширенных атрибутов)

Кажется, есть загвоздка с df и btrfs в Linux. Когда вы попросите df найти точку монтирования для смонтированного тома btrfs, он сделает все правильно. В этом случае joe является подкаталогом / m / whale / backup.

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

Но если каталог, на который имеется ссылка, является второстепенным томом, он больше не будет сообщать вам точку монтирования.

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

Согласно ядру, / a / whale / backup - единственная точка монтирования.

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

FWIW, stat делает то же самое:

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

Из https://stackoverflow.com/questions/2167558/give-the-mount-point-of-a-path:

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

работает везде, где я тестировал, как для * BSD, так и для sysV, а также для дурацких автоматически смонтированных каталогов. Я был бы рад услышать о случае, когда он потерпит неудачу.