मैं कैसे जांच कर सकता हूं /my/dir
कि क्या समान विभाजन पर है /
?
यह एक स्क्रिप्ट के भीतर एकीकरण के लिए है। बाइंड माउंट्स को सही तरीके से हैंडल किया जाना चाहिए। POSIX संगत समाधान का स्वागत करते हैं।
मैं कैसे जांच कर सकता हूं /my/dir
कि क्या समान विभाजन पर है /
?
यह एक स्क्रिप्ट के भीतर एकीकरण के लिए है। बाइंड माउंट्स को सही तरीके से हैंडल किया जाना चाहिए। POSIX संगत समाधान का स्वागत करते हैं।
जवाबों:
आप इसे स्टेट के साथ देख सकते हैं:
$ stat -c '%d %m' /proc/sys/
3 /proc
आपको डिवाइस नंबर दिखाता है और जहां आपकी निर्देशिका माउंट की गई थी।
stat
शेल कमांड पोसिक्स नहीं है ...
निम्न आदेश फ़ाइल वाले आरोह बिंदु के लिए एक विशिष्ट नाम देता है $file
:
df -P -- "$file" | awk 'NR==2 {print $1}'
यह किसी भी POSIX सिस्टम पर काम करता है। -P
विकल्प के लिए एक उम्मीद के मुताबिक प्रारूप लगाता है; दूसरी पंक्ति का पहला क्षेत्र "फ़ाइल सिस्टम नाम" है। इस प्रकार, दो फ़ाइलों की जाँच करने के लिए एक ही आरोह बिंदु के नीचे हैं:
if [ "$(df -P -- "$file1" | awk 'NR==2 {print $1}')" = \
"$(df -P -- "$file2" | awk 'NR==2 {print $1}')" ]; then
echo "$file1 and $file2 are on the same filesystem" ; fi
या, प्रक्रिया चालान के एक जोड़े को बचाने के लिए:
if df -P -- "$file1" "$file2" |
awk 'NR!=1 {dev[NR] = $1} END {exit(dev[2] != dev[3])}'; then
echo "$file1 and $file2 are on the same filesystem" ; fi
कुछ ऑपरेटिंग सिस्टम के वॉल्यूम नामों में स्थान हो सकते हैं। df
इस मामले में आउटपुट पार्स करने का कोई पूरी तरह से विश्वसनीय तरीका नहीं है ।
हुड के तहत, आप फाइल सिस्टम की पहचान कर सकते हैं जिसमें st_dev
रिटर्न द्वारा फाइल की गई फाइल है stat
। शेल स्क्रिप्ट से ऐसा करने का कोई पोर्टेबल तरीका नहीं है। कुछ प्रणालियों की एक stat
उपयोगिता है, लेकिन इसका सिंटैक्स भिन्न होता है:
stat
तो st_dev
फ़ील्ड की रिपोर्ट करता है stat -c %D -- "$file"
।stat
जो GNU कोरुटिल्स के साथ संगत है। दूसरों के पास विकल्प के stat
बिना है %c
; आप उपयोग कर सकते हैं stat -t -- "$file" | awk '{print $8}'
लेकिन यह केवल तभी काम करता है जब फ़ाइल नाम में व्हॉट्सएप नहीं होता है, या stat -t -- "$file" | awk 'END {print $(NF-8)}'
जो मनमाने ढंग से फ़ाइल नामों के साथ आता है, लेकिन stat
आउटपुट में फ़ील्ड के भविष्य के परिवर्धन के साथ नहीं ।stat
उपयोगिता है जिसकी आवश्यकता होती है stat -f %d -- "$file"
।stat
उपयोगिता नहीं है।यदि पर्ल उपलब्ध है, तो आप उपयोग कर सकते हैं
perl -e 'print ((stat($ARGV[0]))[0])' -- "$file"
और तुलना करने के लिए:
perl -e 'exit((stat($ARGV[0]))[0] != (stat($ARGV[1]))[0])' -- "$file1" "$file2"
ध्यान दें कि कुछ कोने मामले हैं जहां वांछित परिणाम स्पष्ट नहीं है। उदाहरण के लिए, लिनक्स के बाइंड माउंट के साथ, के बाद mount --bind /foo /bar
, /foo
और /bar
एक ही फाइल सिस्टम माना जाता है। यह हमेशा संभव है कि दो फाइलें वास्तव में एक ही डिवाइस पर स्थित हों, लेकिन आप कभी नहीं जान पाएंगे: उदाहरण के लिए, यदि फाइलें दो अलग-अलग नेटवर्क माउंट पर हैं, तो क्लाइंट के पास यह जानने का कोई तरीका नहीं है कि सर्वर अलग-अलग फाइल सिस्टम का निर्यात कर रहा है या नहीं।
यदि फ़ाइलें निर्देशिकाएं हैं और आप उन्हें लिख सकते हैं, तो एक अन्य विधि एक अस्थायी फ़ाइल बनाने और हार्ड लिंक बनाने का प्रयास है। यह एक लिनक्स बाइंड माउंट्स पर एक नकारात्मक परिणाम की सूचना देता है।
tmp1=$(TMPDIR=$dir1 mktemp)
tmp2=$(TMPDIR=$dir2 mktemp)
if ln -f -- "$tmp1" "$tmp2"; then
echo "$dir1 and $dir2 are on the same filesystem, which supports hard links"
fi
rm -f "$tmp1" "$tmp2"
df
हमेशा की तरह यह करने के लिए एक सिमलिंक डिवाइस का नाम देना नहीं है, लेकिन कुछ समय /dev/disk/by-uuid/ca09b761-ae1b-450f-8a46-583327b48fb4
बनाने df
विश्वसनीय नहीं। एकमात्र विश्वसनीय विकल्प अब तक एक- stat
आधारित समाधान का उपयोग कर रहा है ।
df
डिवाइस के लिए जो भी नाम रिपोर्ट करता है, वह दो इनवोकेशन के बीच सुसंगत है, इसलिए यह तुलना के लिए ठीक है।
df
रिपोर्ट /dev/sda6
और /dev/disk/by-uuid/ca09b...
, दोनों एक ही डिवाइस का उल्लेख करते हैं, लेकिन अलग-अलग माउंट पॉइंट। प्रत्येक माउंट बिंदु से फ़ाइलों के साथ प्रयास करते समय स्ट्रिंग तुलना परीक्षण स्पष्ट रूप से विफल हो जाता है।
mount /dev/sda6 /mnt1
इसके बाद mount /dev/sda6 /mnt2
आकर्षण की तरह काम करता है। cat /proc/mounts
इसके साथ ठीक है हालाँकि, यह केवल Wheezy के बाद से /dev/disk/by-uuid/ca09b...
है df
जो रूट फाइल सिस्टम के लिए डिवाइस के रूप में दिखाया गया है । इस सिमलिंक या UUID=ca09b...
माउंट सिंटैक्स का उपयोग करके इसे माउंट करने के और प्रयास करने से इसके अलावा और कुछ भी दिखाई नहीं /dev/sda6
देता है df
(मुझे नहीं पता कि बूट प्रक्रिया के दौरान इसे कैसे किया जाए, लेकिन यह चिंता का विषय नहीं है)।
test $(df -P $path1 $path2 | awk '{if (NR!=1) {print $6}}' | uniq | wc -l) -eq 1
किसी भी पथ के साथ काम करता है।
df
है हमेशा एक अच्छा विचार नहीं ।
$6
) की जाँच कर रहा हूँ , डिवाइस का नाम नहीं ( $1
), ताकि कोई समस्या न हो।
POSIX में उपलब्ध सबसे अच्छा फुलप्रूफ सॉल्यूशन स्टेट्स (2) फंक्शन द्वारा उपलब्ध कराई गई फाइलों की डिवाइस आईडी की तुलना है ।
पर्ल के पास एक समान स्टेटमेंट फंक्शन है जैसा कि गिल्स ने बताया :
perl -e 'exit((stat($ARGV[0]))[0] != (stat($ARGV[1]))[0])' -- file1 file2
लेकिन "POSIX तरीका" एक C प्रोग्राम का उपयोग करने के लिए है:
./checksamedev file1 file2
कौन सा स्रोत कोड इस प्रकार है:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
struct stat s1, s2;
if( argc==3 && lstat(argv[1], &s1)==0 && lstat(argv[2], &s2)==0 )
return !(s1.st_dev == s2.st_dev);
return 2;
}
यदि दोनों फ़ाइलों की डिवाइस आईडी समान हैं, तो उन्हें एक ही फाइल सिस्टम पर होस्ट किया जाता है, जिस स्थिति में, ऊपर दिए गए कमांड 0 (किसी अन्य प्रकार से)। के साथ जाँच करें echo $?
।
यह बाइंड माउंट्स के साथ अच्छी तरह से काम करता है, लेकिन संभवतः नेटवर्क माउंट्स के साथ नहीं होगा।