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: nfs
atau ext3
.
The -T
pilihan 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/mtab
atau hasil mount
daripada menggunakan df
bisa dilakukan dalam beberapa kasus lagi.
/proc/mounts
mount
, atau /etc/mtab
bahkan /proc/mounts
tidak standar sehingga tidak ada jaminan tentang apa yang dapat ditemukan di sana ...
-T
memiliki 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/src
dan memiliki tipe sistem file reiserfs
.
Lihat juga man stat
untuk referensi lebih lanjut. Ini adalah perintah yang sangat serbaguna, berguna hampir selalu ketika Anda membutuhkan info tentang file dan tidak ingin kembali ke grep | awk
wardness.
stat
tidak memiliki %m
opsi 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 -l
dan gunakan grep
,, sed
atau awk
untuk menemukan baris yang merujuk ke direktori yang dimaksud.
/my/path/to/the/directory
sebenarnya ada sesuatu dari mountpoint /my/path
dengan jawaban Anda. Mungkin Anda bisa memberikan beberapa rincian lebih lanjut tentang grep
, sed
, awk
perintah 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 --printf
menghasilkan on <mountpoint> type
bagian.
Sayangnya, tidak ada jawaban Unix universal untuk itu.
Satu hal yang dapat Anda lakukan, untuk file yang diberikan /a/b/c/d
adalah berjalan di jalan:
... dan lakukan stat(2)
pada setiap level, hingga st_dev
perubahan. Maka Anda akan tahu di mana titik mount. Kemudian Anda dapat mencari jalur kanonik titik mount itu /etc/mtab
atau dalam output mount
untuk 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.davfs
yang jelas, tapi bagaimana misalnya fuse.gvfs-fuse-daemon
atau fuse.avfsd
yang dapat memiliki keduanya jaringan dan non-jaringan file?
stat(2)
, saya pikir Anda merujuk fungsi C, tapi saya menggunakan shell. Namun, st_dev
merujuk ke ID perangkat utama dan kecil (apakah itu spesifik untuk Linux?), Dan perintah shell stat(1)
memiliki (non-standar) %t
dan %T
dengan --format
opsi untuk masing-masing nomor besar dan kecil, tetapi selalu mengembalikan "0" (lokal dan nfs ). Saya mencoba pada Debian Squeeze dan Lenny.
--file-system
opsi?
--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, -l
opsi ini tidak standar .
df
gagal 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 -t
di Linux dan df -T
di 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
-t
opsi 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 showmount
yang cukup banyak harus diinstal pada sistem apa pun yang benar-benar me-mount NFS
share (bagian dari nfs-common
paket):
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'
mountpoint
utilitas tidak memberitahu Anda jika mount point terpencil. Selain itu, sistem file jarak jauh tidak terbatas pada sistem file NFS. Akhirnya, mountpoint
tidak standar (tidak ada dalam daftar ini ).
mountpoint
adalah standar dalam hal ini.
find . -type d -name nfs -exec mountpoint {} \; | grep not
akan memeriksa semua folder bernama 'nfs' jika sudah terpasang
nfs
.