Jawaban:
Seperti yang dikatakan Stephane , "tidak ada jawaban Unix universal untuk itu".
Solusi terbaik yang saya temukan untuk pertanyaan saya:
df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'
akan mengembalikan tipe sistem file, misalnya: nfsatau ext3.
The -Tpilihan tidak standar , sehingga tidak mungkin bekerja pada sistem Unix / Linux lainnya ...
Menurut komentar Gilles di bawah ini: "Ini berfungsi pada Linux yang tidak tertanam, tetapi tidak pada BusyBox, * BSD, dll."
/etc/mtabatau hasil mountdaripada menggunakan dfbisa dilakukan dalam beberapa kasus lagi.
/proc/mounts
mount, atau /etc/mtabbahkan /proc/mountstidak standar sehingga tidak ada jaminan tentang apa yang dapat ditemukan di sana ...
-Tmemiliki arti berbeda di sini
Anda bisa menggunakan GNU stat.
%m untuk mengetahui titik mount.
$ stat --format=%m /usr/src/linux
/usr/src
%T (dalam mode sistem file) untuk mengetahui nama sistem file.
$ stat --file-system --format=%T /usr/src/linux
reiserfs
Dengan demikian, Anda tahu bahwa /usr/src/linux, di sistem saya, disimpan dalam sistem file yang di-mount /usr/srcdan memiliki tipe sistem file reiserfs.
Lihat juga man statuntuk referensi lebih lanjut. Ini adalah perintah yang sangat serbaguna, berguna hampir selalu ketika Anda membutuhkan info tentang file dan tidak ingin kembali ke grep | awkwardness.
stattidak memiliki %mopsi untuk --format(menggunakan Debian Squeeze, coreutils 8.5). Jadi, saya kira solusi ini tidak terlalu bisa diandalkan.
2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file. Itu hampir 3 tahun yang lalu. Luar biasa bahwa Debian masih belum memiliki ini.
mount -ldan gunakan grep,, sedatau awkuntuk menemukan baris yang merujuk ke direktori yang dimaksud.
/my/path/to/the/directorysebenarnya ada sesuatu dari mountpoint /my/pathdengan jawaban Anda. Mungkin Anda bisa memberikan beberapa rincian lebih lanjut tentang grep, sed, awkperintah Anda menyarankan (jawaban yang lengkap) ?.
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'seharusnya memberi Anda daftar semua nfs mountpoints pada sistem.
mount | fgrep "`stat --printf=" on %m type" /var/log/`". The perintah stat: mount` akan mencetak semua titik mount, dalam <device> on <mountpoint> type <type>format. Untuk memahami ini, saya telah stat --printfmenghasilkan on <mountpoint> typebagian.
Sayangnya, tidak ada jawaban Unix universal untuk itu.
Satu hal yang dapat Anda lakukan, untuk file yang diberikan /a/b/c/dadalah berjalan di jalan:
... dan lakukan stat(2)pada setiap level, hingga st_devperubahan. Maka Anda akan tahu di mana titik mount. Kemudian Anda dapat mencari jalur kanonik titik mount itu /etc/mtabatau dalam output mountuntuk mengetahui tipe sistem file. Kemudian mencari tahu apa yang jauh dan apa yang tidak akan menjadi rumit terutama untuk yang tipe sekering. Misalnya, nfs, cifs, fuse.sshfs, fuse.davfsyang jelas, tapi bagaimana misalnya fuse.gvfs-fuse-daemonatau fuse.avfsdyang dapat memiliki keduanya jaringan dan non-jaringan file?
stat(2), saya pikir Anda merujuk fungsi C, tapi saya menggunakan shell. Namun, st_devmerujuk ke ID perangkat utama dan kecil (apakah itu spesifik untuk Linux?), Dan perintah shell stat(1)memiliki (non-standar) %tdan %Tdengan --formatopsi untuk masing-masing nomor besar dan kecil, tetapi selalu mengembalikan "0" (lokal dan nfs ). Saya mencoba pada Debian Squeeze dan Lenny.
--file-systemopsi?
--file-system.
"-L" ke df (1) akan gagal dengan kesalahan pada sistem file non-lokal, sehingga Anda dapat menggunakan perilaku ini untuk mengetahui apakah sistem file jauh:
df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
echo "local mount, do stuff"
fi
Namun, -lopsi ini tidak standar .
dfgagal dan itu saja membuat ini bukan jawaban yang sangat baik, tetapi ia mencoba menjawab pertanyaan itu jadi saya tidak melihat mengapa Anda menyebutnya "bukan jawaban".
Anda dapat menggunakan df -tdi Linux dan df -Tdi sistem BSD.
Dari man df :
-t, --type = TYPE
membatasi daftar ke sistem file tipe TYPE
if df -t nfs | grep -q /path/to/folder$; then
# it is an NFS
fi
-topsi tersebut memiliki arti berbeda dalam POSIX / SUS. Jadi, menggunakan opsi ini dapat memberikan hasil yang tidak konsisten dalam versi yang berbeda pada alat / UNIX.
Saya pribadi akan menggunakan mountpoint(sangat portabel di Linux!):
NAME
mountpoint - see if a directory is a mountpoint
SYNOPSIS
mountpoint [-d|-q] directory
atau showmountyang cukup banyak harus diinstal pada sistem apa pun yang benar-benar me-mount NFSshare (bagian dari nfs-commonpaket):
NAME
showmount - show mount information for an NFS server
SYNOPSIS
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
Pilihan lain akan seperti:
$ mount -l -t nfs | grep 'my mount point'
mountpointutilitas tidak memberitahu Anda jika mount point terpencil. Selain itu, sistem file jarak jauh tidak terbatas pada sistem file NFS. Akhirnya, mountpointtidak standar (tidak ada dalam daftar ini ).
mountpointadalah standar dalam hal ini.
find . -type d -name nfs -exec mountpoint {} \; | grep not
akan memeriksa semua folder bernama 'nfs' jika sudah terpasang
nfs.