/my/dirএকই পার্টিশনে রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি /?
এটি কোনও স্ক্রিপ্টের মধ্যে একীকরণের জন্য। বাইন্ড মাউন্টগুলি সঠিকভাবে পরিচালনা করা উচিত। POSIX সামঞ্জস্যপূর্ণ সমাধান স্বাগত।
/my/dirএকই পার্টিশনে রয়েছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি /?
এটি কোনও স্ক্রিপ্টের মধ্যে একীকরণের জন্য। বাইন্ড মাউন্টগুলি সঠিকভাবে পরিচালনা করা উচিত। POSIX সামঞ্জস্যপূর্ণ সমাধান স্বাগত।
উত্তর:
আপনি স্ট্যাটাস দিয়ে এটি পরীক্ষা করতে পারেন:
$ stat -c '%d %m' /proc/sys/
3 /proc
আপনাকে ডিভাইস নম্বর এবং যেখানে আপনার ডিরেক্টরিটি মাউন্ট করা হয়েছিল তা দেখায়।
statশেল কমান্ডটি
নিম্নলিখিত কমান্ডটি ফাইল $fileসহ মাউন্ট পয়েন্টের জন্য একটি অনন্য নাম দেয় :
df -P -- "$file" | awk 'NR==2 {print $1}'
এটি কোনও পসিক্স সিস্টেমে কাজ করে । -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জিএনইউ কোর্টিলগুলির সাথে সামঞ্জস্যপূর্ণ একটি অন্তর্ভুক্ত রয়েছে । অন্যদের বিকল্প 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-583327b48fb4making dfএখন পর্যন্ত একমাত্র নির্ভরযোগ্য বিকল্পটি statভিত্তিক সমাধান ব্যবহার করা ।
dfডিভাইসের জন্য যে নামটিই রিপোর্ট করে, এটি দুটি অনুরোধের মধ্যে সামঞ্জস্যপূর্ণ, তাই এটি তুলনার জন্য ঠিক।
dfপ্রতিবেদন /dev/sda6এবং /dev/disk/by-uuid/ca09b...উভয়ই একই ডিভাইসটিকে উল্লেখ করে তবে বিভিন্ন মাউন্ট পয়েন্ট। স্ট্রিং তুলনা পরীক্ষা প্রতিটি মাউন্ট পয়েন্ট থেকে ফাইল চেষ্টা করার সময় অবশ্যই ব্যর্থ হয়।
mount /dev/sda6 /mnt1পরে মনোমুগ্ধকর mount /dev/sda6 /mnt2কাজ করে । cat /proc/mountsএটা ঠিক আছে। তবে, কেবল হুইজি থেকেই মূল ফাইল সিস্টেমের ডিভাইস হিসাবে /dev/disk/by-uuid/ca09b...দেখানো হয়েছে df। আরও প্রচেষ্টা এটা এই simlink ব্যবহার বা মাউন্ট করতে UUID=ca09b...মাউন্ট সিনট্যাক্স ছাড়া অন্য কিছু দেখাচ্ছে শেষ করবেন না /dev/sda6মধ্যে df(আমি পুনর্গঠন করা কিভাবে তা বুট প্রক্রিয়ার সময় সম্পন্ন জানি না, কিন্তু যে উদ্বেগ এখানে নেই)।
test $(df -P $path1 $path2 | awk '{if (NR!=1) {print $6}}' | uniq | wc -l) -eq 1
যে কোনও সংখ্যক পথ নিয়ে কাজ করে।
dfহয় সবসময় একটি ভাল ধারণা না ।
$6ডিভাইসের নাম ( $1) নয়, মাউন্টপয়েন্ট ( ) পরীক্ষা করছি , যাতে সমস্যা না হয়।
পসিএক্স-এ উপলব্ধ সেরা বুদ্ধিমানের সমাধান হ'ল স্ট্যাট (2) ফাংশন দ্বারা সরবরাহ করা ফাইলগুলির ডিভাইস আইডিগুলির তুলনা ।
গিলস যেভাবে উল্লেখ করেছেন পার্লের একই স্ট্যাটাস ফাংশন রয়েছে :
perl -e 'exit((stat($ARGV[0]))[0] != (stat($ARGV[1]))[0])' -- file1 file2
তবে "পসিক্স উপায়" হ'ল সি প্রোগ্রাম ব্যবহার করা যেমন:
./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 $?।
এটি বাইন্ড মাউন্টগুলির সাথে ভালভাবে কাজ করে তবে সম্ভবত নেটওয়ার্ক মাউন্টগুলির সাথে এটি করবে না।