* Nix'te, belirli bir dosyanın hangi dosya sisteminde olduğunu nasıl belirleyebilirim?


12

Genel, modern bir unix ortamında (örneğin, GNU / Linux, GNU / Solaris veya Mac OS X), belirli bir mutlak dosya yolunun hangi bağlama noktası ve dosya sistemi türünde olduğunu belirlemenin iyi bir yolu var mı?

Ben herhalde olabilir yürütmek mountkomuta ve el ile dosya yolu ile dize karşılaştırmak olduğunu ve çıkışını ayrıştırmak, ama ben merak ediyorum bunu yapmadan önce daha zarif bir yol varsa.

Ben genişletilmiş öznitelikleri kullanan bir BASH komut dosyası geliştiriyorum ve çeşitli dosya sistemleri ve ana bilgisayar ortamları için (mümkün olduğu ölçüde) doğru şey yapmak istiyorum.

Yanıtlar:


19

Komut df(1)bir veya daha fazla bağımsız değişken alır ve bu dosya veya dizinin bulunduğu bağlama noktasını ve aygıtı ve kullanım bilgilerini döndürür. Daha sonra çıkış yolundaki mount -vveya benzeri dosya sistemi türünü aramak için yolu veya aygıtı kullanabilirsiniz .

Ne yazık ki, her ikisinin çıktı biçimi dfve mountsisteme bağımlıdır; en azından Solaris, NetBSD ve Mac OS X arasında görebildiğim kadarıyla belirgin bir standart yok.


1
df -Pherhangi bir POSIX uyumlu sistemde standart çıktı üretmelidir. Bazı goofier sistemleri POSIXLY_CORRECT gibi sihirli bir ortam değişkeninin de ayarlanmasını gerektirebilir.
Dan Moulding

Örnek df /path-to-the-directorysize bu dizinin bulunduğu bölümü verecektir
Hasanuzzaman Sattar

7

Stat kullanabilirsiniz . Stat --printf '% d' dosyaadı.txt komutu aygıt numarasını onaltılık / ondalık sayı olarak döndürür.


Peki, bunun üzerine cihaz adı tabanı nasıl bulunur?
Daisy

/ Dev / dizinindeki tüm aygıt dosyalarına gitmeniz ve bildirilen stat ile aynı küçük numaraya sahip bir dosya aramanız gerekir.
Wiesław Herr

stat --printf "%d"bir cihazın az sayıda olduğunu söyler, ancak aygıt adını ve bağlı dosya sistemini almak için daha fazla iş yapılması gerekir.
Craig McQueen

2
Belki son zamanlarda yapılan bir eklemedir ancak stat --format '%m' $filebağlama noktasını stat --file-system --format '%T' $mountverir ve dosya sistemi türü adını sağlar.
roaima

1
@TomHale: dürüst olmak gerekirse hatırlamayın. Ama işe yaramadığını hatırlıyorum. Kuşkusuz, dağıtım, çekirdek sürümü vb. Belirtmeliydim. Net sonuç işe
yarıyorsa


2

Hm. Bağlama noktası için, st_dev değişene kadar hiyerarşiye kadar gidebilirsiniz (daha sonra bir bağlanma sınırını aştınız); statbash betikleri için GNU var ; Ancak, ayrıştırmadan /proc/mountsveya deneme yanılma yoluyla dosya sistemi türünü nasıl tahmin edebileceğinizi bilmiyorum (genişletilmiş öznitelikleri ayarladıktan sonra hataları işleme)


2

Kullanmayla ilgili bir dfşey, çıktıdaki cihaz adı uzunsa satırın sarılacağı, böylece son satırı yakalayamayacağınızdır. Bunun yerine ilk satırı çıkarın ve ardından yeni ilk satırı alın ve ardından ilk alanı yazdırın:

#!/usr/bin/env bash

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

3
POSIX formatında ve satır kesmeden çıktı almak için 'df -P' kullanarak bu yakalamayı önleyin.
MikeyB

2

Linux'ta df ve btrfs ile bir yakalama var gibi görünüyor. Df'den bağlanan bir btrfs birimi için bağlama noktasını bulmasını istediğinizde, doğru olanı yapar. Bu durumda, joe / m / whale / backup dizinidir.

# df /srv/backup/joe
Filesystem      1K-blocks      Used  Available Use% Mounted on
/dev/md126     2930135488 307676684 2619663252  11% /m/whale/backup

Ancak, başvurulan dizin bir alt birim ise, artık bağlama noktasını size söylemez.

# df /srv/backup/joe/code
Filesystem      1K-blocks      Used  Available Use% Mounted on
-              2930135488 307676684 2619663252  11% /a/whale/backup/joe/code

/ A / balina / yedekleme, çekirdeğe göre tek bağlama noktasıdır.

# mount | grep whale
/dev/md126 on /a/whale/backup type btrfs (rw,relatime,space_cache)

FWIW, stat aynı şeyi yapar:

# stat --printf '%m\n' /srv/backup/joe/code
/a/whale/backup/joe/code

1

Gönderen /programming/2167558/give-the-mount-point-of-a-path :

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

Test ettiğim her yerde, hem * BSD'ler hem de sysV'ler ve tuhaf otomatikleştirilmiş dizinler için çalışır. Başarısız olduğu bir davayı duymaktan memnuniyet duyarım.


1
Önerilen kod df -P $ yolu | kuyruk -1 | awk '{print $ NF}' denediğim tüm Solaris sürümlerinde (2.5.1, 8, 9 ve 10) başarısız oluyor çünkü Solaris “df” “-P” seçeneğini desteklemiyor.
Peter John Acklam

@Peter: Düşündüğümden daha az memnunum. Ancak sorunun önemsiz olduğunu bilmek ilginçtir. Ben doğru şeyler kütüphane sorunu düzgün çözmüş bir komut dosyası dilinde bir komut yazmak olduğunu düşünüyorum, örneğin, Python bağlama noktası veren ve Solaris üzerinde çalıştığı varsayıyorum os.path.splitunc () işlevi vardır.
Charles Stewart

@CharlesStewart: Ne yazık ki, Python'da bilgime göre böyle bir işlev yok. os.path.splitunc()yalnızca UNC yolları için çalışır ve yalnızca Windows'ta kullanılabilir .
Aleksi Torhamo
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.