কমান্ড লাইন থেকে দুটি ফাইল হার্ড-লিঙ্কযুক্ত রয়েছে তা আমি কীভাবে বলতে পারি? যেমন কিছু এই লিঙ্ক:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
কমান্ড লাইন থেকে দুটি ফাইল হার্ড-লিঙ্কযুক্ত রয়েছে তা আমি কীভাবে বলতে পারি? যেমন কিছু এই লিঙ্ক:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
উত্তর:
বেশিরভাগ ফাইলসিস্টেমগুলিতে, একটি ফাইল তার ইনোড নম্বর দ্বারা স্বতন্ত্রভাবে নির্ধারিত হয় , সুতরাং আপনার যা যা পরীক্ষা করা দরকার তা হ'ল দুটি ফাইলের একই ইনোড নম্বর রয়েছে এবং একই ফাইল সিস্টেমে রয়েছে কিনা।
অ্যাশ, ksh, বাশ এবং zsh এর একটি কনস্ট্রাক্ট রয়েছে যা আপনার জন্য যাচাই করে: ফাইলের সাম্যতা অপারেটর -ef
।
[ fileA -ef fileB ] && ! [ fileA -ef fileC ]
আরও উন্নত ক্ষেত্রে, ls -i /path/to/file
একটি ফাইলের ইনোড নম্বর তালিকাভুক্ত করে। df -P /path/to/file
ফাইল সিস্টেমটি কী রয়েছে তা দেখায় (যদি দুটি ফাইল একই ডিরেক্টরিতে থাকে তবে তারা একই ফাইল সিস্টেমে থাকে)। যদি আপনার সিস্টেমে stat
কমান্ড থাকে তবে এটি সম্ভবত ইনোড এবং ফাইল সিস্টেম নম্বরগুলি প্রদর্শন করতে পারে ( stat
সিস্টেম থেকে সিস্টেমে পরিবর্তিত হয়, আপনার ডকুমেন্টেশন চেক করুন)। আপনি যদি কোনও ডিরেক্টরিতে হার্ড লিঙ্কগুলির তাত্ক্ষণিক ঝলক চান, তবে চেষ্টা করুন ls -i | sort
(সম্ভবত এডকে পাইপ করা হবে )।
Native সমস্ত নেটিভ ইউনিক্স ফাইল সিস্টেম এবং কয়েকটি অন্যান্য যেমন এনটিএফএস, তবে সম্ভবত ক্র্যামএফএসের মতো বহিরাগত ক্ষেত্রে নেই।
fileA -ef fileB
এছাড়াও 0
(সাফল্য) ফেরত দেয় ( বিপরীতে), বা এর বিপরীতে যদি fileA
একটি সিমিলিংক হয় fileB
বা তারা উভয়ই একই ফাইলে লিঙ্ক হয়।
[ .bashrc -ef .bash/.bashrc ]
সঠিক। প্রসঙ্গ ছাড়া, অবশ্যই, আমি জানিনা কেন এটি "সত্যই কাজ করে না" - আপনি ভুল ফাইলগুলির সাথে তুলনা করতে পারেন, আপনি ফলাফলটি সঠিকভাবে যাচাই করতে পারেন না, আপনি ছাড়া কোনও শেল ব্যবহার করতে পারেন -ef
, ...
[
এবং এর প্রতিশব্দ test
। তবে man [
বা man test
আপনাকে বাহ্যিক কমান্ডের ম্যান পেজ দেবে, যেখানে প্রায় প্রতিটি শেলের বাইরে কিছুটা ভিন্ন বিকল্প সহ একটি অন্তর্নির্মিত কমান্ড থাকে, সুতরাং আপনার শেলটির ম্যানুয়ালটিতে আপনাকে এটি সন্ধান করতে হবে।
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
stat -c %d
)। এবং যদি আপনি লিনাক্সে থাকেন (আপনার stat
আদেশ দেওয়া হয়েছে ) তবে আপনার শেলটি [ fileA -ef fileB ]
সরাসরি এই কাজটি করতে পারে। এছাড়াও, আপনার কমান্ড কৃত্রিমভাবে হোয়াইটস্পেসযুক্ত ফাইলের নামগুলির সাথে বিরতি দেয় \[?*
বা এর সাথে শুরু হয় -
: সর্বদা কমান্ড স্যাসবিটিচিউশনগুলি ( "$(stat -c %i -- "$1")"
) এর আশেপাশে ডাবল উদ্ধৃতি রাখুন ।
function
কোনও ফাংশন নাম সহ অবর্ণনীয়ভাবে অ-বহনযোগ্য কীওয়ার্ড যা (কোনও ড্যাশ রাখার কারণে) অনুমোদিত নামগুলিতে পসিক্স কনভেনশন লঙ্ঘন করে?
$1
এবং $2
। আপনি $()
ব্যাকটিক্সের পরিবর্তে সিনট্যাক্সটিও ব্যবহার করতে চাইতে পারেন কারণ বন্ধনীগুলি এটি স্পষ্ট করে দেয় যেখানে কমান্ডটি শুরু হয় এবং কোথায় এটি শেষ হয় এবং নীড় বাঁধানো সহজ।
প্রথম পোস্টারের পরামর্শ অনুসারে, আপনি লিনাক্সে এই জাতীয় কোনও কিছুর উপর ভিত্তি করে একটি স্ক্রিপ্ট লিখতে পারেন:
stat -c '%i' fileA fileB fileC
stat -c %d
)। এবং যদি আপনি লিনাক্সে থাকেন (আপনার stat
আদেশ দেওয়া হয়েছে ) তবে আপনার শেলটি [ fileA -ef fileB ]
সরাসরি এই কাজটি করতে পারে।
জিএনইউ find(1)
সংস্করণ ৪.২.১১ বা আরও নতুন দিয়ে আপনি এটিও ব্যবহার করতে পারেন:
if [ "yes" = "$(find fileA -samefile fileB -exec echo yes \;)" ]; then
echo yes
else
echo no
fi
যদি fileA
একই ফাইল হয় fileB
তবে find
"হ্যাঁ" মুদ্রণ করা হবে এবং শর্তটি সত্য হয়ে উঠবে।
ফাইল সাম্যতা অপারেটর ব্যবহারের বিপরীতে এটি -ef
একটি নতুন প্রক্রিয়া তৈরি করবে।