информация о монтировании для текущего каталога

20

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

Есть ли какая-нибудь команда mountinfo, которая mountinfo .дает информацию, которую я хочу (например df ., но с информацией, которая mountдает.)


Я использую Debian Gnu + Linux.

Ctrl-Alt-Делор
источник
1
Я верю, что statкоманда может быть использована также. Тем не менее, я не уверен, %mподдерживается ли опция, которая дает точку монтирования, в вашей версии системы. Я проверил свою систему, и она, похоже, не вернула точку монтирования.
Рамеш
1
@Ramesh, Yes stat "--printf=%m\n" .получает точку монтирования файловой системы, в которой находится текущий каталог. Таким образом, мы можем упростить некоторые ответы. Благодарю.
Ctrl-Alt-Delor

Ответы:

18

Я думаю, что вы хотите что-то вроде этого:

findmnt -T .

При использовании опции

-T, --target  путь
если путь не является файлом или каталогом точки монтирования, 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переключателя utput. Я могу получить такой же вывод, как -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
mikeserv
источник
Мне нравится это, кроме немного -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 .

Если вам нужна система, которая имеет утилиту для всего, что не взаимодействует друг с другом, то вам может помочь некий мистер Гейтс ;-)

garethTheRed
источник
--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формата.

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

Чарльз Стюарт
источник
Можете ли вы сказать нам, что echo $()добавляет к команде?
Ctrl-Alt-Delor