Як у * nix, як визначити, на якій файловій системі використовується конкретний файл?


12

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

Я припускаю, що я міг би виконати mountкоманду та вручну проаналізувати результат цього виводу та порівняти рядки зі своїм файловим шляхом, але перед тим, як це зробити, мені цікаво, чи існує більш елегантний спосіб.

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

Відповіді:


19

Команда df(1)бере один чи більше аргументів і поверне точку монтажу та пристрій, на якому існує цей файл чи каталог, а також інформацію про використання. Потім ви можете використовувати шлях або пристрій для пошуку типу файлової системи на виході mount -vабо подібному.

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


1
df -Pмає виробляти стандартизований вихід на будь-яку систему, сумісну з POSIX. Деякі системи гуфорів можуть вимагати також встановлення магічної змінної середовища, наприклад POSIXLY_CORRECT.
Dan Molding

Приклад df /path-to-the-directoryдасть вам розділ, що містить цей каталог
Hasanuzzaman Sattar

7

Ви можете використовувати stat . Команда stat --printf '% d' filename.txt поверне номер пристрою у вигляді шістнадцяткових / десяткових.


Отже, як знайти на цьому базу імен пристроїв?
ромашка

Вам потрібно перейти, хоча всі файли пристрою в / dev / і шукати один із тим самим незначним номером, як зареєстрований stat.
Wiesław Herr

stat --printf "%d"говорить вам про незначну кількість пристрою, але потрібно зробити ще багато роботи, щоб отримати ім’я пристрою та його встановлену файлову систему.
Крейг МакКвін

2
Можливо, це нещодавнє доповнення, але stat --format '%m' $fileдасть точку монтажу та stat --file-system --format '%T' $mountнадасть ім'я типу файлової системи.
roaima

1
@TomHale: не пам'ятаю, якщо чесно. Але я пам’ятаю, що це не спрацювало. Справді, я мав би заявити про дистрибутив, версію ядра тощо. Якщо чистий результат такий, що він працює, чудово :)
0xC0000022L


2

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


2

Одним із проблем із використанням dfє те, що якщо ім'я пристрою у висновку довге, то рядок загортається, тому ви не можете просто схопити останній рядок. Замість цього зніміть перший рядок, а потім візьміть новий перший рядок, а потім надрукуйте перше поле:

#!/usr/bin/env bash

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

3
Уникайте цієї готчі, використовуючи 'df -P', щоб отримати вихід у форматі POSIX та без розриву рядків.
MikeyB

2

Здається, що у Linux є улов з df та btrfs. Коли ви попросите df знайти точку монтування для змонтованого тома btrfs, він зробить правильно. У цьому випадку, Джо - це підкаталог / 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 / khale / резервна копія є єдиною точкою кріплення відповідно до ядра.

# 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

1

З /programming/2167558/give-the-mount-point-of-a-path :

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

працює скрізь, де я перевірив, як для BSD, так і для sysV, і для дурних автоматизованих каталогів. Я був би радий почути про випадок, коли це не вдалося.


1
Запропонований код df -P $ шлях | хвіст -1 | awk '{print $ NF}' провалюється у всіх версіях програми, яку я пробував (2.5.1, 8, 9 та 10), тому що "df" Solaris не підтримує опцію "-P".
Пітер Джон Аклам

@ Peter: Я менш в захваті, ніж я думав, що буду. Але цікаво знати, що проблема нетривіальна. Я думаю, що правильним є написання команди на мові сценаріїв, бібліотека якої вирішила проблему належним чином, наприклад, Python має функцію os.path.splitunc (), яка дає точку монтажу, і яка я припускаю, що працює на Solaris.
Чарльз Стюарт

@CharlesStewart: На жаль, у Python такої функції немає, наскільки мені відомо. os.path.splitunc()працює лише для шляхів UNC і доступний лише в Windows .
Алексі Торхамо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.