Как получить точку монтирования файловой системы, содержащей данный файл

Вам нужен сценарий постсоединения для wicd. Можно установить его в /etc/wicd/wireless-settings.conf или /etc/wicd/wired-settings. Иначе должен использовать wicd-gtk: в странице настроек сети существует кнопка "Scripts".

Иначе должен поместить сценарий в /etc/wicd/scripts/postconnect/. Затем это должно быть выполнено автоматически после каждого соединения с сетью.

Для получения дополнительной информации посмотрите здесь.

12
13.04.2017, 15:37
5 ответов

Вы могли сделать что-то как

df -P FILE | awk 'NR==2{print $NF}'

или даже

df -P FILE | awk 'END{print $NF}'

С тех пор awk разделения на пробеле (пробелах) по умолчанию, Вы не должны указывать -F и Вы также не должны обрезать пробел с tr. Наконец, путем определения номера строки интереса (NR==2) можно также покончить tail.

6
27.01.2020, 19:54
  • 1
    2-е колдовство работавший out-of-the-box, в то время как я должен был измениться 2 - 3 в первом. аккуратный –  Stu 12.09.2013, 01:55
  • 2
    @Gilles, спасибо за редактирование. Один вопрос, второе должно работать даже без -P правильно? Во всех случаях, самое последнее поле, распечатанное awk должен быть диск. –  terdon♦ 12.09.2013, 02:34
  • 3
    @Stu, который это, вероятно, потому что я не использовал -P опция, которую просто добавил Gilles. –  terdon♦ 12.09.2013, 02:35
  • 4
    @terdon Да, действительно, последнее поле последней строки является тем же без -P. Тем не менее, я всегда рекомендую использовать -P когда Вы анализируете вывод df, это легче, чем проверка, что это конкретное использование безопасно. –  Gilles 'SO- stop being evil' 12.09.2013, 02:37
  • 5
    . если Вам нужно к теперь/dev записи за $ {ФАЙЛ} (по некоторым причинам) mount | grep " on $(df -P ${FILE} | awk 'END{print $NF}') type" | awk '{print $1}' –  unsynchronized 05.06.2016, 07:43

На GNU/Linux, если у Вас есть GNU stat от coreutils 8.6 или выше, Вы могли сделать:

stat -c %m -- "$file"

Иначе:

mount_point_of() {
  f=$(readlink -e -- "$1") &&
    until mountpoint -q -- "$f"; do
      f=${f%/*}; f=${f:-/}
    done &&
    printf '%s\n' "$f"
}

Ваш подход допустим, но предполагает, что точка монтирования не содержит пространство, %, новую строку или другие непечатаемые символы, можно упростить его немного с более новыми версиями GNU df (8.21 или выше):

df --output=target FILE | tail -n +2
15
27.01.2020, 19:54
  • 1
    Мой df не распознает --output опция. –  Joseph R. 11.09.2013, 19:03
  • 2
    @JosephR. это - версия 8.21 или выше? –  terdon♦ 11.09.2013, 19:57
  • 3
    @terdon No это - версия 8.13. –  Joseph R. 12.09.2013, 01:49
  • 4
    @JosephR. Stephane объясняет в своем ответе, что это - функция GNU df > =8.21. –  terdon♦ 12.09.2013, 02:35
  • 5
    @terdon Извините, должно быть, пропустил его при скольжении. –  Joseph R. 12.09.2013, 02:43

С тех пор stat возвращает поле "Device", мне было любопытно видеть как базовое stat() вызов библиотеки мог использоваться для получения этой информации программно в POSIX совместимый путь.

Этот отрывок кода C:

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

int main (int argc, const char *argv[]) {
    struct stat info;
    stat(argv[1], &info);
    printf("min: %d maj: %d\n",
        minor(info.st_dev),
        major(info.st_dev)
    );

    return 0;
}  

Даст главный и незначительный идентификатор устройств для устройства, содержащего файл, перечисленный на командной строке (argv[1]). К сожалению, major() и minor() не POSIX, хотя страница справочника утверждает, что они "присутствуют во многих других системах" помимо GNU/linux.

Можно затем получить корреспонденцию между устройством главное/незначительное число и узлом устройства от, например, /proc/diskstats, и карта это к точкам монтирования от /proc/mounts, иначе. /etc/mtab.

Так утилита командной строки, чтобы сделать это было бы довольно просто.

3
27.01.2020, 19:54
  • 1
    /proc/diskstats только для блочных устройств, Вы пропустите NFS, proc, предохранитель... На Linux, по крайней мере, различные точки монтирования могут иметь тот же maj+min –  Stéphane Chazelas 11.09.2013, 18:28
  • 2
    , не знал это, спасибо. Это также кажется этим st_dev может не позволить отличать один раздел NFS от другого. Кто бы ни на самом деле хочет записать, что это должно будет взять это во внимание ;) –  goldilocks 11.09.2013, 18:30
  • 3
    +1 для того, чтобы быть действительно фанатом, что Вы считаете запись C кодом "более простой или более прямой", чем, что OP делал :). –  terdon♦ 12.09.2013, 04:19

Вот еще код C ++, если вы хотите сделать это из C ++ ...

  #include <boost/filesystem.hpp>
  #include <sys/stat.h>

  /// returns true if the path is a mount point
  bool Stat::IsMount(const std::string& path)
  {

      if (path == "") return false;
      if (path == "/") return true;

      boost::filesystem::path path2(path);
      auto parent = path2.parent_path();

      struct stat sb_path;
      if (lstat(path.c_str(), &sb_path) == -1) return false; // path does not exist
      if (!S_ISDIR(sb_path.st_mode)) return false; // path is not a directory

      struct stat sb_parent;
      if (lstat(parent.string().c_str(), &sb_parent) == -1 ) return false; // parent does not exist

      if (sb_path.st_dev == sb_parent.st_dev) return false; // parent and child have same device id

      return true;

  }

  /// returns the path to the mount point that contains the path
  std::string Stat::MountPoint(const std::string& path0)
  {
      // first find the first "real" part of the path, because this file may not exist yet
      boost::filesystem::path path(path0);
      while(!boost::filesystem::exists(path) )
      {
          path = path.parent_path();
      }

      // then look for the mount point
      path = boost::filesystem::canonical(path);
      while(! IsMount(path.string()) )
      {
          path = path.parent_path();
      }

      return path.string();
  }

Дополнительные ссылки для программных способов

0
27.01.2020, 19:54

Для Linux у нас есть findmnt от util-linux, специально созданный для этого

findmnt -n -o TARGET --target /path/to/FILE

Обратите внимание, что некоторая случайная точка монтирования может быть возвращена в случае, если есть несколько монтирований привязки. При использовании df возникает та же проблема.

11
27.01.2020, 19:54

Теги

Похожие вопросы