ইউনিক্সে সাধারণত একটি ফাইল ফাইলের টেবিলের মধ্যে কিছু প্রবেশ entry বিভিন্ন ধরণের ফাইল রয়েছে: নিয়মিত ফাইল, ডিভাইস, প্রতীক লিঙ্ক, দরজা, পাইপ, সকেট, ডিরেক্টরি ...
ইনোড নম্বর (যা আপনি এর আউটপুটে দেখতে পাবেন ls -i
) হ'ল সেই সারণির সূচক।
এখন, আপনি ইনোড দ্বারা নয় তবে পথ ধরে ফাইল অ্যাক্সেস করতে পারেন । একটি পাথ ডিরেক্টরি এন্ট্রিগুলির একটি শৃঙ্খল । আপনি লক্ষ্য করবেন যে আমরা এখানে ফোল্ডারের কথা বলছি না তবে ডিরেক্টরিতে যাচ্ছি । কারণ এটি হ'ল ডিরেক্টরি যা হয় (কোনও ফোনের ডিরেক্টরি মনে করে)।
ডিরেক্টরি হ'ল একটি বিশেষ ধরণের ফাইল যা বেশ কয়েকটি ইনোডকে নাম দেয়। ডিরেক্টরি এন্ট্রি হ'ল নাম থেকে একটি ইনোডে ম্যাপিং।
প্রদত্ত ফাইলের (একটি ইনোড) একটি ডিরেক্টরিতে একাধিক নাম থাকতে পারে (ঠিক যেমন একটি ফোন নম্বরতে একাধিক নাম থাকতে পারে), এবং একাধিক ডিরেক্টরিতে নাম (এন্ট্রি) থাকতে পারে। ঐ বলা হয় লিঙ্ক নামেও পরিচিত হার্ড সংযোগগুলি সঙ্গে পার্থক্য নরম লিঙ্ক (ফাইল একটি বিশেষ ধরনের যা একটি পাথ একটি পয়েন্টার)।
একটি ফাইল (আইনোড) এতে থাকা লিঙ্কগুলির সংখ্যা (যে কোনও ডিরেক্টরিতে প্রবেশের ক্ষেত্রে) ট্র্যাক করে রাখে, যাতে যখন সংখ্যাটি 0 পৌঁছায় (যখন এটি সর্বশেষ ডিরেক্টরিটি থেকে রেফারেন্স করা হয়েছিল তখন এটি লিঙ্কযুক্ত করা হয়), এটি বাতিল করা হয়।
এটি ls -l
আউটপুট প্রদর্শিত হবে যে সংখ্যা (লিঙ্ক সংখ্যা) ।
একটি অ-ডিরেক্টরি ফাইল প্রথমবার সৃষ্টি করা হলে (সঙ্গে open
বা creat
(অথবা bind
অথবা mknod
কিছু ফাইল প্রকারগুলি) সিস্টেম কলের জন্য), এটা নতুন ফাইল (মত এমন একটি পথ সঙ্গে তাদের প্রদানের মাধ্যমে সম্পন্ন করা হয় "/a/b"
)। তারপরে যা ঘটে তা একটি নতুন ফাইল এবং ইনোড বরাদ্দ করা হয় এবং মূল ডিরেক্টরিতে "a"
নামের সাথে যুক্ত ডিরেক্টরিতে একটি নতুন এন্ট্রি যুক্ত করা হয় "/"
। এটি প্রাথমিক লিঙ্ক তাই লিঙ্কের গণনা এক।
link()
সিস্টেম লিঙ্ক ( ln
কমান্ড) এর সাথে পরে আরও লিঙ্ক যুক্ত করা যেতে পারে । এবং লিঙ্কগুলি unlink()
সিস্টেম কল ( rm
কমান্ড) দিয়ে মুছে ফেলা যায় ।
আপনি লক্ষ্য করতে পারেন যে টাইপ ডিরেক্টরি ফাইলগুলির ফাইলগুলিতে সাধারণত বেশিরভাগ সংখ্যক লিঙ্ক থাকে 2 বা এর সমান।
এখন, আপনি যখন একটি ডিরেক্টরি তৈরি করেন, আপনি mkdir()
সিস্টেম কল কল করছেন। কিছু একটা mkdir("/a/b")
। এটি তখন যা করে তা হ'ল টাইপের ডিরেক্টরিতে নতুন ফাইল বরাদ্দ করা। নতুন ডিরেক্টরিতে এটি স্বয়ংক্রিয়ভাবে দুটি এন্ট্রি তৈরি করে:
"."
( ডিরেক্টরি জন্য বিন্দু )। যা নিজের কাছে একটি লিঙ্ক। সুতরাং লিঙ্ক গণনা এখন 1।
".."
(জন্য ডিরেক্টরির 'র ডিরেক্টরি )। কোনটি একটি লিঙ্ক "/a"
। সুতরাং লিঙ্ক গণনা "/a"
এক এক দ্বারা বৃদ্ধি করা হয়
তারপরে সেই নতুন ডিরেক্টরিটির সাথে লিঙ্ক করা হয়েছে "/a"
( "/a"
এটির জন্য একটি এন্ট্রি যুক্ত করা হয়েছে ), সুতরাং এটির লিঙ্ক গণনাটি এখন ২ হয় a যদি কোনও "/a/b/c"
ডিরেক্টরি তৈরি করা হয়, ".."
প্রবেশের কারণে "/a/b/c"
, এর লিঙ্কের কাউন্টটি "/a/b"
3 হয়ে যাবে।
বেশিরভাগ ইউনিট ডিরেক্টরিতে আরও লিঙ্ক তৈরি করা সীমাবদ্ধ করে কারণ তারা সমস্যাযুক্ত লুপ তৈরি করতে পারে। যখন তারা link()
কোনও ডিরেক্টরিতে কোনও অনুমতি দেয় , সাধারণত কেবলমাত্র সুপারইসার এটি করতে পারে।
কিছু ফাইল সিস্টেম যেমন btrfs
traditionalতিহ্যবাহী ডিরেক্টরি কাঠামো থেকে প্রস্থান করে। আপনি লক্ষ্য করবেন যে btrfs
ফাইল সিস্টেমে ডিরেক্টরিগুলির লিঙ্কের সংখ্যা সর্বদা এক থাকে যদিও এই ডিরেক্টরিগুলিতে সেগুলির "."
মতো একই ইনোড নম্বর সহ একটি এন্ট্রি থাকে ।
লিঙ্ক গণনাটি traditionতিহ্যগতভাবে 2 টির চেয়ে বেশি এবং সাবডায়ারের সংখ্যার ব্যবহার রয়েছে The উদাহরণস্বরূপ, এতে:
find . -name '*.c' -print
তাহলে .
subdirs ধারণ করে না কিন্তু ফাইল লক্ষ লক্ষ রয়েছে। লিংক গণনা টিক চিহ্ন দেওয়ার দ্বারা .
, find
জানতে পারেন কোন subdir নেই। সুতরাং সমস্তই find
হ'ল ডিরেক্টরিটির বিষয়বস্তু পড়তে হবে এবং এন্ট্রিগুলি যেগুলি শেষ হয় .c
( grep '\.c$'
কয়েক মেগাবাইট ফাইলের মতো এটি কোনও বড় বিষয় নয়) প্রতিবেদন করে। অন্যথায়, find
সেখানে ডিরেক্টরিতে নামার জন্য ডিরেক্টরি রয়েছে কিনা তা দেখতে প্রতিটি একক ফাইলের ধরণ পরীক্ষা করে দেখতে হবে (ফলে যতগুলি lstat()
সিস্টেম কল আসে)। অবশ্যই, এই ধরণের অপ্টিমাইজেশন কাজ করে না btrfs
(যদিও লিনাক্সের আধুনিক সংস্করণগুলিতে, ফাইলের ধরণটি কিছু ফাইল সিস্টেমের জন্য ডিরেক্টরি এন্ট্রিতে সঞ্চিত থাকে (সহ btrfs
) এবং প্রবেশের getdents(2)
তালিকা পুনরুদ্ধার করতে ব্যবহৃত সিস্টেম কল দ্বারা ফিরে আসে একটি ডিরেক্টরি, তাইlstat
এখনও প্রয়োজনীয় নয়)।