Belirli bir dosyayı içeren dosya sisteminin bağlama noktası nasıl alınır


13

Belirli bir DOSYA içeren dosya sisteminin bağlama noktasını bulmak için hızlı bir yol arıyorum. Aşağıdaki çözümümden daha basit veya daha doğrudan bir şey var mı?

df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' '

Benzer bir soru " Bir diskin nereye monte edildiğini görmek için bir komut var mı? ", Geçerli diskin aygıt düğümünü disk olarak rasgele bir dosya olarak değil giriş olarak kullanır ...


1
Son traramayı kullanarakawk -F'% '...
Joseph R.

Yanıtlar:


6

Gibi bir şey yapabilirdin

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

ya da

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

Yana awkvarsayılan olarak boşluk üzerinde bölünme (ler), belirttiğiniz gerekmez -Fve ayrıca birlikte boşluk kırpmak gerek yok tr. Son olarak, ilgilenilen satır numarasını ( NR==2) belirterek de ortadan kaldırabilirsiniz tail.


ilk olarak 2'den 3'e değiştirmek zorunda kaldım 2. ikinci kutudan çıktığı anda çalıştı. temiz
Stu

@Gilles, düzenleme için teşekkürler. Bir soru, ikincisi -Pdoğru olmadan çalışmalı mı? Her durumda, en son yazdırılan awkalan disk olmalıdır.
terdon

@Stu muhtemelen -PGilles'in eklediği seçeneği kullanmamıştım.
terdon

1
@terdon Evet, gerçekten de, son satırın son alanı onsuz aynıdır -P. Bununla birlikte -P, çıktısını ayrıştırırken her zaman kullanmanızı öneririm df, bu özel kullanımın güvenli olup olmadığını kontrol etmekten daha kolaydır.
Gilles 'SO- kötü olmayı bırak'

Güzel. / dev girdisine $ {FILE} için (bir nedenle) girmeniz gerekiyorsamount | grep " on $(df -P ${FILE} | awk 'END{print $NF}') type" | awk '{print $1}'
senkronize olmayan

16

GNU / Linux'ta, statcoreutils 8.6 veya üzeri sürümlerden GNU'nuz varsa şunları yapabilirsiniz:

stat -c %m -- "$file"

Aksi takdirde:

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

Yaklaşımınız geçerlidir, ancak bağlama noktasının boşluk,%, satırsonu veya yazdırılamayan diğer karakterler içermediğini varsayar, yeni GNU sürümleriyle df(8.21 veya üstü) biraz basitleştirebilirsiniz :

df --output=target FILE | tail -n +2

Benim seçeneği dftanımıyor --output.
Joseph R.

@JosephR. sürüm 8.21 veya üzeri mi?
terdon

@terdon Hayır sürüm 8.13.
Joseph R.

2
@JosephR. Stephane cevabında bunun GNU df> = 8.21'in bir özelliği olduğunu açıklıyor .
terdon

@terdon Üzgünüm gözden geçirme sırasında kaçırmış olmalı.
Joseph R.

8

Linux için tam olarak bunun için yapılmış util-linux'dan findmnt var

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

Birden fazla bağlama yuvası olması durumunda bir tür rastgele bağlama noktasının döndürülebileceğini unutmayın. Kullanmak dfaynı soruna sahiptir.


2
Alt hacimlerde olan dosyalarla bile doğru çalışır.
ceremcem

3

statBir "Aygıt" alanı döndürdüğünden beri , temel stat()kütüphane çağrısının bu bilgiyi POSIX uyumlu bir şekilde programlı olarak almak için nasıl kullanılabileceğini merak ettim .

Bu C kodu pasajı:

#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;
}  

Komut satırında ( argv[1]) listelenen dosyayı içeren aygıtın ana ve ikincil aygıt kimliklerini verir . Ne yazık ki, major()ve minor()değildir POSIX, onlar GNU / linux yanında "diğer sistemlerin mevcut" olan adam sayfası iddiaları rağmen.

Daha sonra cihaz majör / minör sayısı ve cihaz düğüm, örneğin arasında bir ilişki olsun, olabilir /proc/diskstats, ve bağlama noktaları için bu harita /proc/mounts, aka. /etc/mtab.

Yani bunu yapmak için bir komut satırı yardımcı programı oldukça basit olacaktır.


/proc/diskstatssadece blok cihazlar içindir, NFS, proc, sigortayı kaçırırsınız ... En azından Linux'ta farklı bağlantı noktaları aynı maj + min'e sahip olabilir
Stéphane Chazelas

Bunu bilmiyordum, teşekkürler. Ayrıca st_dev, bir NFS bölümünü diğerinden ayırmanın bir yolu bulunmayabileceği de görülmektedir . Aslında bunu yazmak
isteyenler

C kodunu OP'nin yaptıklarından "daha basit veya daha doğrudan" yazmayı düşündüğünüz bir geek için +1.
terdon

0

C ++ 'dan bunu yapmak istiyorsanız daha fazla C ++ kodu ...

  #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();
  }

Programlı yollar için daha fazla bağlantı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.