Как получить имя диска с учетом идентификатора диска? - PullRequest
2 голосов
/ 04 ноября 2019

Системный вызов stat (man 2 stat) возвращает идентификатор устройства, содержащего файл.

В сценарии этот идентификатор можно получить, например, с помощью

perl -e 'print((stat "/tmp/blah.txt")[0])'
* 1007. * Учитывая идентификатор, как мне получить имя диска, например, /dev/sda2 или /dev/disk1s1?

Я хочу сделать это в сценарии (bash, perl и т. Д.), Предпочтительно впортативный способ, чтобы он надежно работал как на MacOS, так и на Linux.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Я думаю, что вы пытаетесь заново изобрести колесо.
Учитывая имя файла, имя файловой системы, которому оно принадлежит, можно найти в первом столбце последней строки в выводе df. Например:

df -P /tmp | awk 'END { print $1 }'
1 голос
/ 04 ноября 2019

Вы можете использовать 'df' для перечисления файловой системы и создания карты между идентификаторами устройства и диском. Вспомните, что каждая строка df будет перечислять точку монтирования (/ dev / sda1, ...) в первом столбце и точку монтирования в 5-м столбце).

Следующий скрипт использует ассоциативный массив bash дляmap и stat -c '% d' для извлечения значения 'dev' заданного пути.

# Create map dev2fs
function file2dev {
   stat -c '%d' "$1"
# If needed, use Perl equivalent
#    perl -e 'print ((stat($ARGV[0]))[0])' "$1"
}

declare -A dev2fs
while read fs size used available use mount ; do
    id=$(file2dev $mount);
    [ "$id" ] &&  dev2fs[$id]=$fs
done <<< "$(df)"

# Map a file to device
dev=$(file2dev /path/to/file );
echo "Device=${dev2fs[$dev]}"

Кроме того, можно выполнить итерацию по смонтированной файловой системе, используя 'mount -l'. Я не уверен, какой из них существует в MacOS.

...