інформація про кріплення для поточного каталогу


20

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

Чи є mountinfoтака команда , яка mountinfo .дає інформацію, яку я хочу (як df ., але з інформацією, яка mountдає.)


Я використовую Debian Gnu + Linux.


1
Я вважаю, statкоманда може бути використана також. Однак я не впевнений, чи %mпідтримується у вашій версії системи опція, яка дає точку монтажу. Я перевірив свою систему і, здавалося, не повертає точку кріплення.
Рамеш

1
@Ramesh, Yes stat "--printf=%m\n" .отримує точку монтажу файлової системи, в якій знаходиться поточна директорія. Таким чином, ми дозволяємо спростити деякі відповіді. Спасибі.
ctrl-alt-delor

Відповіді:


18

Я думаю, ти хочеш щось подібне:

findmnt -T .

При використанні опції

-T, --цільовий шлях
якщо шлях не є файлом або каталогом монтажу, findmntперевіряє елементи контуру в зворотному порядку, щоб отримати точку монтування. Ви можете надрукувати лише певні поля через -o, --output [list].
Див findmnt --help. Список доступних полів.


Можна також запустити:

(until findmnt . ; do cd .. ; done)

Проблема, з якою ви стикаєтесь, полягає в тому, що всі шляхи відносно того чи іншого, тож вам просто потрібно ходити по дереву. Кожного разу.

findmntє членом пакету util-linux і вже кілька років. На сьогоднішній день, незалежно від вашого дистрибутиву, він уже має бути встановлений на вашій машині Linux, якщо у вас також є mountінструмент.

man mount | grep findmnt -B1 -m1
For  more robust and customizable output use
findmnt(8),  especially  in  your   scripts.

findmntбуде надрукувати всю інформацію про монтування без аргументу точки монтажу, і лише цю для її аргументу з одним. -DЄ емулюватиdf варіант. Без -Dйого виходу схожий на mounts - але набагато більш настроюваний. Спробуйте findmnt --helpі переконаєтеся самі.

Я вставляю її в підрозділ, щоб поточний каталог поточної оболонки не змінювався.

Так:

mkdir -p /tmp/1/2/3/4/5/6 && cd $_ 
(until findmnt . ; do cd .. ; done && findmnt -D .) && pwd

ВИХІД

TARGET SOURCE FSTYPE OPTIONS
/tmp   tmpfs  tmpfs  rw
SOURCE FSTYPE  SIZE   USED AVAIL USE% TARGET
tmpfs  tmpfs  11.8G 839.7M   11G   7% /tmp
/tmp/1/2/3/4/5/6

Якщо у вас немає -Dдоступної для вас опції (не для старих версій util-linux), вам не потрібно ніколи боятися - це трохи більше, ніж зручність у будь-якому випадку. Зверніть увагу на заголовки стовпців, які він створює для кожного дзвінка - ви можете включати або виключати ті, що стосуються кожного виклику, за допомогою -oперемикача виводу. Я можу отримати той самий вихід, який -Dможе надати:

 findmnt /tmp -o SOURCE,FSTYPE,SIZE,USED,AVAIL,USE%,TARGET

ВИХІД

SOURCE FSTYPE  SIZE  USED AVAIL USE% TARGET
tmpfs  tmpfs  11.8G  1.1G 10.6G  10% /tmp

Мені це подобається, окрім дещо -D, у мене немає такого варіанту. (Я на Debian7, util-linux 2.20.1-5.3)
ctrl-alt-delor

Я вам √ через кілька днів, я залишу деякий час, щоб побачити, чи є у кого більш досконала відповідь. Хоча це близько до ідеального (якби він працював як df: не потрібен цикл, то це було б ідеально).
ctrl-alt-delor

@richard - це гарна ідея - мені не подобається, коли відповіді надто скоро приймаються. що стосується циклу і df- я готовий зробити ставку, що це цикл, вам просто не потрібно говорити, щоб це зробити.
mikeserv

1
Завдяки @ramesh ми також можемо зробитиfindmnt $(stat "--printf=%m\n" .)
ctrl-alt-delor

2
У моїй версії findmntє -Tваріант, який може обійти cd ..цикл. Може бути корисним комусь іншому.
азот

1

Спосіб Linux / Unix полягає в тому, щоб мати набір інструментів для невеликих утиліт, які в поєднанні дають вам результати, за якими ви хочете.

Вони, як правило, не мають утиліти для кожного випадку. Натомість у вас є багато маленьких корисних утиліт, які поєднуються разом з трубами тощо. Перевагою цього є те, що ви можете написати власну утиліту досить легко, якщо такої немає.

Наприклад, щоб отримати інформацію, яку ви шукаєте, ви можете використовувати:

mount | grep $(df  --output=source . | tail -1)

Якщо ви хочете повторно використовувати вищезазначене з різними каталогами, створіть сценарій:

#!/bin/bash
mount | grep $(df  --output=source $1 | tail -1)

Збережіть його як mountinfoі зробіть його виконуваним ( chmod +x mountinfo). Потім ви можете використовувати його як:

mountinfo .

Якщо ви хочете, щоб система мала утиліту для всього, з яким ніхто не взаємодіє, то певний містер Гейтс може вам допомогти ;-)


--outputіснує лише в останніх версіях GNU coreutils (≥8,22).
Жил 'ТАК - перестань бути злим'

Це майже все, що я робив, це просто те, що mountбез жодних варіантів здається трохи задумливим: за допомогою параметрів ви створюєте точки монтажу, не перераховуючи їх, я сподівався на кращий інструмент списку. Як ми бачимо @mikeserv показав нам findmnt.
ctrl-alt-delor

1

Це може бути дещо безладним, якщо точки монтажу містять пробіли, але це має працювати, за винятком випадків, коли точки монтажу містять нові рядки:

#!/bin/sh
mountpoint="$(df -P "$1" | awk '{
    if (NR==1)
        i=index($0,"Mounted on");
    else
        print substr($0,i);
    }')"
mount|grep " on ${mountpoint} type "

df -Pвиводить один рядок для файлової системи; без цієї опції dfможе вивести два рядки, якщо точка монтажу довга. Назва точки монтування починається в тому ж стовпці, що і мітка "Монтаж на" в рядку заголовка.

Після того, як ми отримаємо точку монтажу, ми притягуємо її до висновку mount.


1

Я не знаю команди, але ви можете створити функцію. Ви можете додати нижче до своїх .bashrc:

mountinfo () {
  mount | grep $(df -P "$1" | tail -n 1 | awk '{print $1}')
}

Це виконує mountкоманду і передає вихід grep. grepшукатиме вихід df -P "$1" | tail -n 1 | awk '{print $1}'та розбиває його:

  • df -P "$1"буде працювати dfна аргументі, переданому функції,
  • tail -n 1виведе лише другий рядок, той, що містить partitionінформацію.
  • awk '{print $1}'надрукує першу частину цього рядка, наприклад номер номера диска / розділу /dev/sda5. Ось що grepбуде шукати в команді mount і вивести її.

Джерело вашого .bashrcфайлу, щоб застосувати зміни, або вийдіть із системи та увійдіть назад.

Тепер, якщо ви запустите mountinfo ., ви отримаєте потрібний результат.


Це в значній мірі те, що я роблю (але без функції, я цього не роблю достатньо, коли я це роблю в інших системах, наприклад, відповіді на цьому веб-сайті.), Це просто те, що mountбез варіантів здається трохи після роздумів: за допомогою параметрів ви створюєте точки монтажу, не перераховуючи їх, я сподівався на кращий інструмент списку. Як ми бачимо @mikeserv показав нам findmnt.
ctrl-alt-delor

0

Якщо ви використовуєте не зовсім давню версію GNU coreutils df, тоді це echo $(df . --output=target | tail -n 1)працює. Так само stat -c '%m' ., хоча, зауважу, що в https://linux.die.net/man/1/stat бракує документації щодо параметра %mформату.

Зробити це портативно стомлено: жодне з перерахованих вище не працюватиме з версіями BSD або Cygwin stat або df. Якщо б не було можливості пробілів у контурах точок кріплення, df -P . | tail -1 | awk '{ print $NF}'було б добре, але часто на флеш-накопичувачах USB є пробіли у назві гучності, які, ймовірно, з'являться на шляху монтування та порушують це. Для портативності Perl встановлюється практично скрізь, а CPAN має модуль Sys :: Filesystem :: MountPoint, який забезпечує бажану функціональність.


Чи можете ви сказати нам, що echo $()додає до команди?
ctrl-alt-delor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.