Bagaimana saya bisa mengecek apakah /my/dir
ada di partisi yang sama /
?
Ini untuk integrasi dalam skrip. Bind mounts harus ditangani dengan benar. Selamat datang solusi yang kompatibel dengan POSIX.
shell-script
mount
Totor
sumber
sumber
Jawaban:
Anda dapat memeriksa ini dengan stat:
Menunjukkan nomor perangkat Anda dan tempat direktori Anda dipasang.
sumber
stat
perintah shell bukan POSIX ...Perintah berikut memberikan nama unik untuk titik pemasangan yang berisi file
$file
:Ini berfungsi pada sistem POSIX apa pun . The
-P
pilihan membebankan format diprediksi; bidang pertama dari baris kedua adalah "nama sistem file". Jadi, untuk memeriksa dua file berada di bawah titik pemasangan yang sama:Atau, untuk menyimpan beberapa proses pemanggilan:
Beberapa sistem operasi dapat memiliki ruang dalam nama volume. Tidak ada cara yang sepenuhnya dapat diandalkan untuk mengurai
df
output dalam kasus ini.Di bawah tenda, Anda dapat mengidentifikasi sistem file yang berisi file menurut
st_dev
bidang yang dikembalikan olehstat
. Tidak ada cara portabel untuk melakukan ini dari skrip shell. Beberapa sistem memilikistat
utilitas, tetapi sintaks bervariasi:stat
melaporkanst_dev
bidang ketika dipanggil sebagaistat -c %D -- "$file"
.stat
yang kompatibel dengan GNU coreutils. Lain memilikistat
tanpa%c
pilihan; Anda dapat menggunakanstat -t -- "$file" | awk '{print $8}'
tetapi ini hanya berfungsi jika nama file tidak mengandung spasi, ataustat -t -- "$file" | awk 'END {print $(NF-8)}'
yang mengatasi dengan nama file yang sewenang-wenang tetapi tidak dengan penambahan bidang di masa depan untukstat
output.stat
utilitas berbeda yang membutuhkanstat -f %d -- "$file"
.stat
utilitas.Jika Perl tersedia, Anda dapat menggunakan
dan untuk melakukan perbandingan:
Perhatikan bahwa ada beberapa kasus sudut di mana hasil yang diinginkan tidak jelas. Sebagai contoh, dengan bind mount Linux, setelahnya
mount --bind /foo /bar
,/foo
dan/bar
dianggap sebagai sistem file yang sama. Selalu dimungkinkan bahwa kedua file tersebut sebenarnya terletak pada perangkat yang sama tetapi Anda tidak akan pernah tahu: misalnya, jika file berada di dua tunggangan jaringan yang berbeda, klien tidak memiliki cara untuk mengetahui apakah server mengekspor sistem file yang berbeda.Jika file tersebut adalah direktori dan Anda dapat menulisnya, metode lain adalah membuat file sementara dan berusaha membuat tautan keras. Yang ini melaporkan hasil negatif di seluruh mount mengikat Linux.
sumber
df
tidak selalu memberikan nama perangkat, tetapi kadang-kadang symlink/dev/disk/by-uuid/ca09b761-ae1b-450f-8a46-583327b48fb4
membuatnyadf
tidak dapat diandalkan. Satu-satunya pilihan yang dapat diandalkan sejauh ini adalah menggunakanstat
solusi berbasis.df
melaporkan untuk perangkat, itu konsisten antara dua doa, jadi tidak apa-apa untuk perbandingan.df
laporan/dev/sda6
dan/dev/disk/by-uuid/ca09b...
, keduanya merujuk ke perangkat yang sama, tetapi titik pemasangan berbeda. Uji perbandingan string jelas gagal ketika mencoba dengan file dari setiap titik pemasangan.mount /dev/sda6 /mnt1
diikuti olehmount /dev/sda6 /mnt2
karya-karya seperti pesona.cat /proc/mounts
tidak masalah dengan itu. Namun, hanya sejak Wheezy yang/dev/disk/by-uuid/ca09b...
ditampilkandf
sebagai perangkat untuk sistem file root. Upaya lebih lanjut untuk memasangnya menggunakan simlink ini atauUUID=ca09b...
sintaks mount tidak berakhir menunjukkan apa pun selain/dev/sda6
didf
(saya tidak tahu bagaimana mereproduksi apa yang dilakukan selama proses boot, tapi itu bukan masalah di sini).Bekerja dengan sejumlah jalur.
sumber
df
adalah tidak selalu ide yang baik .$6
), bukan nama perangkat ($1
), sehingga seharusnya tidak menjadi masalah.Solusi terbaik yang tersedia di POSIX adalah perbandingan ID perangkat file yang disediakan oleh fungsi stat (2) .
Perl memiliki fungsi stat yang sama dengan yang ditunjukkan Gilles :
tetapi "cara POSIX" adalah menggunakan program C seperti:
kode sumber yang mana adalah sebagai berikut:
Jika ID perangkat kedua file sama, mereka dihosting di sistem file yang sama, dalam hal ini, perintah di atas mengembalikan 0 (nilai lain jika tidak). Periksa dengan
echo $?
.Ini berfungsi baik dengan bind mounts, tapi mungkin tidak dengan network mounts.
sumber