В общей современной среде 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, а также для дурацких автоматически смонтированных каталогов. Я был бы рад услышать о случае, когда он потерпит неудачу.