Di * nix, bagaimana cara menentukan sistem file tempat file tertentu?

12

Dalam lingkungan umum unix modern (katakanlah, GNU / Linux, GNU / Solaris, atau Mac OS X), apakah ada cara yang baik untuk menentukan tipe mountpoint dan sistem file mana path file absolut tertentu aktif?

Saya kira saya bisa menjalankan mountperintah dan secara manual mem-parsing keluaran itu dan membandingkannya dengan jalur file saya, tetapi sebelum saya melakukannya saya bertanya-tanya apakah ada cara yang lebih elegan.

Saya sedang mengembangkan skrip BASH yang menggunakan atribut diperluas, dan ingin membuatnya Melakukan Hal yang Benar (sebagian kecil dimungkinkan) untuk berbagai sistem file dan lingkungan host.

smokris
sumber

Jawaban:

19

Perintah df(1)mengambil satu atau lebih argumen dan akan mengembalikan mountpoint dan perangkat tempat file atau direktori itu ada, serta informasi penggunaan. Anda kemudian dapat menggunakan path atau perangkat untuk mencari tipe sistem file di output mount -vatau serupa.

Sayangnya, format output keduanya dfdan mountbergantung pada sistem; tidak ada standar yang jelas, setidaknya seperti yang saya lihat antara Solaris, NetBSD dan Mac OS X.

Morven
sumber
1
df -Pharus menghasilkan keluaran terstandardisasi pada sistem yang sesuai dengan POSIX. Beberapa sistem konyol mungkin memerlukan variabel lingkungan ajaib, seperti POSIXLY_CORRECT, yang harus ditetapkan juga.
Dan Moulding
Contoh df /path-to-the-directoryakan memberi Anda partisi berisi direktori itu
Hasanuzzaman Sattar
7

Anda bisa menggunakan stat . Perintah stat --printf '% d' filename.txt akan mengembalikan nomor perangkat sebagai hex / desimal.

Sakit kepala
sumber
Jadi, Bagaimana menemukan nama perangkat berdasarkan itu?
daisy
Anda harus membuka semua file perangkat di / dev / dan mencari satu dengan nomor minor yang sama seperti yang dilaporkan stat.
Wiesław Herr
stat --printf "%d"tidak memberitahu Anda sejumlah kecil perangkat, tetapi masih ada banyak pekerjaan yang harus dilakukan untuk mendapatkan nama perangkat dan sistem file yang terpasang.
Craig McQueen
2
Mungkin ini tambahan baru tetapi stat --format '%m' $fileakan memberi Anda titik mount, dan stat --file-system --format '%T' $mountakan memberikan nama jenis sistem file.
roaima
1
@ TomHale: tidak ingat, jujur. Tapi saya ingat itu tidak berhasil. Memang saya harus menyatakan distro, versi kernel dll. Tetapi Anda menyatakan itu bekerja, mungkin juga berarti sudah diperbaiki sementara itu. Jika hasil akhirnya adalah ini berfungsi, bagus :)
0xC0000022L
3

Untuk file tertentu saja semudah

df -T "${FILE}" | awk '{print $2}' | tail -n1
Julian Pawlowski
sumber
Tidak bekerja dengan btrfs!
0xC0000022L
2

Hm Untuk titik mount, Anda dapat naik hierarki sampai st_dev berubah (maka Anda baru saja melewati batas mount); ada GNU statuntuk skrip bash; Namun, saya tidak tahu bagaimana Anda bisa menebak tipe sistem file tanpa penguraian /proc/mountsatau dengan coba-coba (yaitu menangani kegagalan setelah mengatur atribut yang diperluas)

ΤΖΩΤΖΙΟΥ
sumber
2

Salah satu yang perlu digunakan dfadalah bahwa jika nama perangkat dalam output panjang, baris akan dibungkus sehingga Anda tidak bisa hanya mengambil baris terakhir. Alih-alih menghapus baris pertama dan kemudian ambil baris pertama yang baru dan kemudian cetak bidang pertama:

#!/usr/bin/env bash

path=$1
curdir=$(pwd)
cd $path
df . | tail -n +2 | head -1 | awk '{print $1}'
cd $curdir
mage2k
sumber
3
Hindari gotcha ini dengan menggunakan 'df -P' untuk mendapatkan output dalam format POSIX dan tanpa putus baris.
MikeyB
2

Tampaknya ada masalah dengan df dan btrfs di Linux. Ketika Anda meminta df untuk menemukan titik mount untuk volume btrf yang terpasang, itu akan melakukan hal yang benar. Dalam hal ini, joe adalah sub-direktori dari / m / whale / backup.

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

Tetapi jika direktori yang direferensikan adalah sub-volume, itu tidak akan memberi tahu Anda titik pemasangan lagi.

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

/ A / whale / backup adalah satu-satunya titik pemasangan menurut kernel.

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

FWIW, stat melakukan hal yang sama:

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

Dari /programming/2167558/give-the-mount-point-of-a-path :

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

bekerja di mana saja saya telah menguji, untuk * BSD dan sysVs, dan untuk direktori automacked aneh. Saya akan senang mendengar kasus di mana ia gagal.

Charles Stewart
sumber
1
Kode yang disarankan df -P $ path | ekor -1 | awk '{print $ NF}' gagal pada semua versi Solaris yang saya coba (2.5.1, 8, 9, dan 10) karena Solaris '"df" tidak mendukung opsi "-P".
Peter John Acklam
@ Peter: Saya kurang senang dari yang saya kira. Tetapi menarik untuk mengetahui bahwa masalahnya adalah nontrivial. Saya pikir hal yang benar adalah dengan menulis perintah dalam bahasa scripting yang pustaka telah menyelesaikan masalah dengan benar, misalnya, Python memiliki fungsi os.path.splitunc () yang memberikan titik mount dan yang saya anggap berfungsi pada Solaris.
Charles Stewart
@CharlesStewart: Sedihnya, tidak ada fungsi seperti itu di Python yang saya ketahui. os.path.splitunc()hanya berfungsi untuk jalur UNC dan hanya tersedia di Windows .
Aleksi Torhamo