দুটি ফাইল কি হার্ডলিঙ্কযুক্ত?


27

কমান্ড লাইন থেকে দুটি ফাইল হার্ড-লিঙ্কযুক্ত রয়েছে তা আমি কীভাবে বলতে পারি? যেমন কিছু এই লিঙ্ক:

$ ls
fileA fileB fileC

$ is-hardlinked fileA fileB
yes

$ is-hardlinked fileA fileC
no

উত্তর:


37

বেশিরভাগ ফাইলসিস্টেমগুলিতে, একটি ফাইল তার ইনোড নম্বর দ্বারা স্বতন্ত্রভাবে নির্ধারিত হয় , সুতরাং আপনার যা যা পরীক্ষা করা দরকার তা হ'ল দুটি ফাইলের একই ইনোড নম্বর রয়েছে এবং একই ফাইল সিস্টেমে রয়েছে কিনা।

অ্যাশ, 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 সমস্ত নেটিভ ইউনিক্স ফাইল সিস্টেম এবং কয়েকটি অন্যান্য যেমন এনটিএফএস, তবে সম্ভবত ক্র্যামএফএসের মতো বহিরাগত ক্ষেত্রে নেই।


এবং অবশ্যই এফএটি-ভিত্তিক কোনও কিছুর উপরে নয়, যেখানে এটি একটি "ক্রস লিঙ্কযুক্ত" ফাইল হিসাবে সনাক্ত করা হবে।
ইগনাসিও ওয়াজকেজ-আব্রামস

4
দ্রষ্টব্য যে fileA -ef fileBএছাড়াও 0(সাফল্য) ফেরত দেয় ( বিপরীতে), বা এর বিপরীতে যদি fileAএকটি সিমিলিংক হয় fileBবা তারা উভয়ই একই ফাইলে লিঙ্ক হয়।
janmoesen

আপনি যে কমান্ডটি প্রস্তাব করেছিলেন তা বাস্তবে কীভাবে চালাবেন? আমি [.bashrc -ef .bash / .bashrc] এবং এর বিভিন্নতা চেষ্টা করেছি কিন্তু এটি আসলে কার্যকর হয়নি।
চার্লি পার্কার

@CharlieParker [ .bashrc -ef .bash/.bashrc ]সঠিক। প্রসঙ্গ ছাড়া, অবশ্যই, আমি জানিনা কেন এটি "সত্যই কাজ করে না" - আপনি ভুল ফাইলগুলির সাথে তুলনা করতে পারেন, আপনি ফলাফলটি সঠিকভাবে যাচাই করতে পারেন না, আপনি ছাড়া কোনও শেল ব্যবহার করতে পারেন -ef, ...
গিলস 'এস-অশুভ হওয়া বন্ধ করুন'

2
@ চর্লিপর্কার কমান্ডটি আসলে [এবং এর প্রতিশব্দ test। তবে man [বা man testআপনাকে বাহ্যিক কমান্ডের ম্যান পেজ দেবে, যেখানে প্রায় প্রতিটি শেলের বাইরে কিছুটা ভিন্ন বিকল্প সহ একটি অন্তর্নির্মিত কমান্ড থাকে, সুতরাং আপনার শেলটির ম্যানুয়ালটিতে আপনাকে এটি সন্ধান করতে হবে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

4
function is-hardlinked() {
    r=yes
    [ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
    echo $r
}

6
মনে রাখবেন যে দুটি ফাইল পৃথক ফাইল সিস্টেমে থাকলেও একই ইনোডের ক্ষেত্রে ঘটে গেলে এটি একটি মিথ্যা ইতিবাচক হতে পারে। আপনাকে ডিভাইস নম্বরও পরীক্ষা করতে হবে ( stat -c %d)। এবং যদি আপনি লিনাক্সে থাকেন (আপনার statআদেশ দেওয়া হয়েছে ) তবে আপনার শেলটি [ fileA -ef fileB ]সরাসরি এই কাজটি করতে পারে। এছাড়াও, আপনার কমান্ড কৃত্রিমভাবে হোয়াইটস্পেসযুক্ত ফাইলের নামগুলির সাথে বিরতি দেয় \[?*বা এর সাথে শুরু হয় -: সর্বদা কমান্ড স্যাসবিটিচিউশনগুলি ( "$(stat -c %i -- "$1")") এর আশেপাশে ডাবল উদ্ধৃতি রাখুন
গিলস

1
আপনি কেন একগুচ্ছ জটিল কিন্তু পোর্টেবল কনস্ট্রাক্টস ব্যবহার করবেন, এবং তারপরে functionকোনও ফাংশন নাম সহ অবর্ণনীয়ভাবে অ-বহনযোগ্য কীওয়ার্ড যা (কোনও ড্যাশ রাখার কারণে) অনুমোদিত নামগুলিতে পসিক্স কনভেনশন লঙ্ঘন করে?
চার্লস ডাফি

আপনি আপনার $1এবং $2। আপনি $()ব্যাকটিক্সের পরিবর্তে সিনট্যাক্সটিও ব্যবহার করতে চাইতে পারেন কারণ বন্ধনীগুলি এটি স্পষ্ট করে দেয় যেখানে কমান্ডটি শুরু হয় এবং কোথায় এটি শেষ হয় এবং নীড় বাঁধানো সহজ।
জোস্ক

3

প্রথম পোস্টারের পরামর্শ অনুসারে, আপনি লিনাক্সে এই জাতীয় কোনও কিছুর উপর ভিত্তি করে একটি স্ক্রিপ্ট লিখতে পারেন:

stat -c '%i' fileA fileB fileC

4
এটি যথেষ্ট নয়: আপনি যদি দুটি ফাইল সিস্টেমে থাকেন তবে দুটি ফাইলের জন্য একই নম্বর পাবেন তবে একই ইনোড হবে। আপনাকে ডিভাইস নম্বরও পরীক্ষা করতে হবে ( stat -c %d)। এবং যদি আপনি লিনাক্সে থাকেন (আপনার statআদেশ দেওয়া হয়েছে ) তবে আপনার শেলটি [ fileA -ef fileB ]সরাসরি এই কাজটি করতে পারে।
গিলস

0

জিএনইউ find(1)সংস্করণ ৪.২.১১ বা আরও নতুন দিয়ে আপনি এটিও ব্যবহার করতে পারেন:

if [ "yes" = "$(find fileA -samefile fileB -exec echo yes \;)" ]; then
    echo yes
else
    echo no
fi

যদি fileAএকই ফাইল হয় fileBতবে find"হ্যাঁ" মুদ্রণ করা হবে এবং শর্তটি সত্য হয়ে উঠবে।

ফাইল সাম্যতা অপারেটর ব্যবহারের বিপরীতে এটি -efএকটি নতুন প্রক্রিয়া তৈরি করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.