./ এবং ../ ডিরেক্টরি কি?


20

সাধারণ প্রশ্ন, তবে আমি কোথায় নিশ্চিত তা নিশ্চিত নই এবং গুগল পিরিয়ড এবং স্ল্যাশের প্রতিক্রিয়া জানায় না।

আমি কেবল বর্তমান ডিরেক্টরিতে (সাবফোল্ডার / ফাইলগুলি সহ নয়) ফাইল এবং ডিরেক্টরিগুলির # টি গণনা করার চেষ্টা করছি এবং পার্থক্য করার চেষ্টা করছি ls -1 | wc -lএবং ls | wc -lযেহেতু সেগুলি অভিন্ন বলে মনে হচ্ছে। আমি যে সাইটটি দেখছিলাম সেটিতে বলেছিল "মনে রাখবেন যে এটি। / এবং ../ ডিরেক্টরিগুলিও গণনা করছে।" যার সাথে এটি সম্পর্কিত ls -1এবং আমি নিশ্চিত নই যে এর অর্থ এর মধ্যে ডিরেক্টরিগুলি আগে বা কিছু (যা আমি চাই না) অন্তর্ভুক্ত রয়েছে, তবে এটি টেস্টিং থেকে এমনটি মনে হয় নি।

কেবলমাত্র বর্তমান ডিরেক্টরিতে ফাইল (ডিরেক্টরি নয়) (ডিরেক্টরি নয়) এবং। / এবং ../ ডিরেক্টরি বলতে কী বোঝায় সেগুলির মধ্যে কোনটি ফাইল এবং ডিরেক্টরিগুলির গণনা করার জন্য সবচেয়ে উপযুক্ত হবে তা কেউ নিশ্চিত করতে পারেন?


"মনে রাখবেন যে এটি। / এবং ../ ডিরেক্টরিগুলিও গণনা করছে" ভুল (এটি যদি "।" এবং ".." এর জন্য টাইপ না হয়)
ভনব্র্যান্ড

উত্তর:


15

ইউনিক্স সিস্টেমের প্রতিটি ডিরেক্টরিতে (এবং সম্ভবত প্রতিটি অন্যান্য সিস্টেমেও) কমপক্ষে দুটি ডিরেক্টরি এন্ট্রি থাকে। এগুলি .(বর্তমান ডিরেক্টরি) এবং ..(মূল ডিরেক্টরি) directory রুট ডিরেক্টরিগুলির ক্ষেত্রে, এটি একই স্থানে নির্দেশ করে তবে অন্য কোনও ডিরেক্টরিতে এগুলি পৃথক। আপনি আপনার নিজের জন্য এই দেখতে ব্যবহার করতে পারেন stat, pwdএবং cd(লিনাক্সের দিকে) কমান্ড:

$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d      Inode: 2           Links: 27
Device: 802h/2050d      Inode: 2           Links: 27
Device: 802h/2050d      Inode: 548865      Links: 2
Device: 802h/2050d      Inode: 2670593     Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$

লক্ষ্য করুন binএবং এর sbinপ্রতিটিটির সাথে দুটি লিঙ্ক রয়েছে। একটি হ'ল মূল ডিরেক্টরিতে ডিরেক্টরি এন্ট্রি, এবং অন্যটি .সেই ডিরেক্টরিতে প্রবেশকরণ।

lsপাইপ দিয়ে ব্যবহার করা wc -lls এর আউটপুটে লাইনের সংখ্যা গণনা করার জন্য একটি সহজ কৌশল। অনুমানটি হ'ল প্রতিটি ফাইল বা ডিরেক্টরি আউটপুটে ঠিক একটি লাইন দখল করে। GNU ls will, যখন আউটপুটটি একটি নন-টার্মিনাল হয়, স্বয়ংক্রিয়ভাবে এটি করবে; -1স্পষ্টভাবে আচরণটি চালু করার জন্য অন্যদের বিকল্পের প্রয়োজন হতে পারে । wc -lকেবল তার ইনপুটটিতে লাইনগুলির সংখ্যা ( -l) গণনা করে এবং আউটপুট দেয় ।

এই পদ্ধতির সমস্যাটি হ'ল লিনাক্সে এবং লিনাক্সে traditionতিহ্যগতভাবে ব্যবহৃত ফাইল সিস্টেমগুলিতে, ফাইল এবং ডিরেক্টরিগুলির নাম (তারা সত্যই এক এবং এই ক্ষেত্রে একই রকম) নতুন লাইন অক্ষর ধারণ করার অনুমতি পায় । এগুলির উপস্থিতিতে, উভয়ই পদ্ধতি বিচ্ছিন্ন হয় - বাস্তবে যখন সেগুলি হয় তখন ent এন্ট্রিগুলি দুটি বা ততোধিক এন্ট্রি হিসাবে গণ্য হবে।

যতক্ষণ আপনি জিএনইউ এলএস ব্যবহার করছেন, নতুন রেখাযুক্ত অক্ষর যুক্ত নামের সাথে কোনও ডিরেক্টরি এন্ট্রি নেই এবং ls(যেমন উদাহরণস্বরূপ ls -a) এর কোনও বিজোড় এলিয়াস নেই , উভয়ই বর্তমান (বা নির্দিষ্ট) ডিরেক্টরিতে ফাইল এবং ডিরেক্টরিগুলির সংখ্যা নির্ধারণ করবে। বেশিরভাগ লোকের পক্ষে এটি যথেষ্ট ভাল তবে সাধারণ ক্ষেত্রে এটি বৈধ নয় ।

ডিরেক্টরী এন্ট্রি নামগুলিতে আপনার যদি অস্বাভাবিক অক্ষরগুলি (প্রাথমিকভাবে নিউলাইনগুলি) সঠিকভাবে পরিচালনা করতে হয় তবে আমি -bতাদের পালাতে ls এর বিকল্পটি ব্যবহার করার পরামর্শ দিই । ls -1bAপ্রতিটি ডিরেক্টরি এন্ট্রি নামটি তার নিজস্ব লাইনে মুদ্রণ করবে, অস্বাভাবিক অক্ষরগুলি এড়িয়ে চলবে (সুতরাং প্রতিটি ডিরেক্টরি এন্ট্রি এক হিসাবে দেখা যাবে), কোনও ডটফাইলস এবং-ডিরেক্টরি সহ। উপর ট্যাক wc -lসম্পূর্ণ কমান্ড লাইন এর জন্য ls -1bA | wc -l(কিন্তু উপেক্ষা করা যা ফাইল এবং বর্তমান ডিরেক্টরির মধ্যে ডিরেক্টরি সংখ্যা রিপোর্ট হবে .এবং ..; যে পার্থক্য -aএবং -A), কিন্তু কোনো সাবডিরেক্টরি মধ্যে নামা। আপনি যদি কোনও ডটফাইলগুলি মোটের সাথে গণনা করতে না চান তবে কেবলমাত্র -Aপ্যারামিটারটি বাদ দিন ls


উভয়ই -aএবং -Aহাইড ফাইলগুলিও অন্তর্ভুক্ত করে যা আমি বুঝতে পেরেছি যে আমি এড়াতে চাই, তাই বেশিরভাগ ক্ষেত্রে আমি করব ls -b | wc -l, তবে এটি আমাকে সঠিক উত্তর দেয় না। এই কমান্ডটি সম্পর্কে আমি অনুলিপি করে আটকানো লাইনটি কি ভুল? যদি এটি সঠিক ছিল, যখন কোনও ডিরেক্টরিতে 6 টি ফাইল বা ফোল্ডার থাকে তখন আমি 8 টি আউটপুট পাব না?
আদম

@ অ্যাডাম হ্যাঁ, এটি সম্ভবত কৌশলটি করবে ("ls -b | wc -l"); আপনি "-1" (ড্যাশ + নাম্বার ওয়ান )ও ব্যবহার করতে পারেন যা একক লাইনে সকলের পরিবর্তে একক কলামে একটি তালিকা তৈরি করতে বাধ্য করে, তবে অন্য কমান্ডে পাইপিং করার পরে তা ঘটে যায়। সুতরাং (imho) আমি এটিকে "ls -1b | wc -l" হিসাবে রেখে যাব; এবং "পরীক্ষা" করতে, "ls -1b" চালান এবং লাইনের সংখ্যা গণনা করুন, তারপরে "ls -1b | wc -l" চালান এবং ফলাফলগুলি যাচাই করুন। (এটি কীভাবে পাইপগুলি ডিবাগ / টেস্ট করতে হয়))
মাইকেল 25

@ সারদাথ্রিয়ন, এফএকিউ যথেষ্ট বিভ্রান্তিকর। ইউনিক্স ফাইল সিস্টেম কনভেনশনগুলি "অদ্ভুত" নয়; যেখানে তারা সাধারণ হয় এটি অন্যান্য সিস্টেম তাদেরকে বাছাই করে। কিন্তু ঠিক. তারপরে এটি বলে যে "ফাইল কমান্ডটি সনাক্ত করতে ম্যাজিক সংখ্যা ব্যবহার করে ...", যা ভুল: এটি প্রচুর পরিমাণে হিউরিস্টিক্স ব্যবহার করে। আমার বইতে খুব নির্ভরযোগ্য নয়।
ভোনব্র্যান্ড

@ ভনব্র্যান্ড: যথেষ্ট ন্যায্য, লিঙ্ক মুছে ফেলা হয়েছে। আমি কেবল এটি স্কিম করেছিলাম এবং এটি দুর্দান্ত মনে হয়েছিল। আমি জানি যে আমি একটি ভাল পেয়েছি কিন্তু এখন এটি কোথায় ছিল তা মনে করতে পারে না।
সারদাথ্রিয়ন - মনিকা

1
তুমি ভুল করছ: . এবং .. 1970নসত্তরের দশকে ইউএনআইএক্সের historicতিহাসিক নিদর্শনসমূহ এবং এটি এমন এক সময় থেকে ফলাফল যখন কোনও mkdir()সিস্টেম কল আসে নি। সমস্ত ফাইল সিস্টেমে সেগুলি নেই এবং সেগুলি পসিক্সের দ্বারা প্রয়োজনও হয় না বা প্রয়োজন হয় না।
সুন্দরভাবে

6

বিষয়টিতে প্রশ্নের উত্তর দিতে:

যখন ইউনিক্সে বি ডিরেক্টরি তৈরি করা হয়, তখন এটি অন্য ডিরেক্টরি এ-এর নতুন এন্ট্রি হিসাবে যুক্ত হয় (এর মূল ডিরেক্টরি), এবং বিতে দুটি এন্ট্রি যুক্ত হয়: একটিকে .নিজের কাছে একটি হার্ড লিঙ্ক হিসাবে ডাকা হয়, এবং একটিকে ..হার্ড বলা হয় one এ লিঙ্ক

এগুলি অনুমোদিত ডিরেক্টরিগুলির মধ্যে কেবলমাত্র শক্ত লিঙ্কগুলি (যদিও কিছু ইউনিসির কিছু পুরানো সংস্করণও স্বেচ্ছাসেবী লিঙ্কগুলিকে মঞ্জুরি দেয়)।

এ কারণেই বেশিরভাগ ফাইল সিস্টেমের সাথে ( btrfsএকটি উল্লেখযোগ্য ব্যতিক্রম হিসাবে), linksডিরেক্টরিটির সংখ্যা এটির কতগুলি সাব-ডাইরেক্টরি রয়েছে তা (তাদের ..প্রবেশের জন্য অ্যাকাউন্টিং ) একটি ইঙ্গিত ।

আপনি যখন ডিরেক্টরিটির নাম পরিবর্তন / সরিয়ে রাখছেন, যদি এটি একই ডিরেক্টরিতে হয় (ভিন্ন নামের অধীনে), কেবলমাত্র নাম প্রবেশকরণ Aপরিবর্তন করা হয়। বি এর .এবং ..প্রভাবিত হয় না। কিন্তু আপনি যদি এটি একটি ভিন্ন ডিরেক্টরির না সরানো, তারপর ..মধ্যে Bপরিবর্তন করতে হবে। এটি ব্যাখ্যা করে যে কেন আপনি যে ডিরেক্টরিতে লেখার অ্যাক্সেস নেই (যেমন অভিভাবক ডিরেক্টরিতে আপনার লেখার অ্যাক্সেস রয়েছে তা ধরে নেওয়া) কেবলমাত্র আপনি যতক্ষণ অন্য ডিরেক্টরিতে না সরান (অন্যথায় ..এন্ট্রি পরিবর্তন করার প্রয়োজনকে বাধা দেয়) আপনি এটি সরানো থেকে)।

যদিও সাবধান থাকুন: এর মতো /a/b/../cনাও হতে পারে /a/cকারণ অন্য কোনও ডিরেক্টরিতে প্রতীকী লিঙ্ক /a/bহতে পারে ।

তার ব্যতিক্রম হ'ল যখন সেই পথটি cdকয়েকটি শেলের কমান্ডকে দেওয়া হয় । সেই cdগুলি বিবেচনা .. কথাটি উপেক্ষা ..ডিরেক্টরিগুলি থেকে এন্ট্রি। আপনি প্রায়শই cd -Pসঠিকভাবে লিখিত স্ক্রিপ্টগুলিতে দেখতে পান এমন একটি কারণ , যা বৈশিষ্ট্যটি অক্ষম করার জন্য যা অন্যথায় বিভ্রান্তি এবং অসঙ্গতি সৃষ্টি করতে পারে।

বর্তমান ডিরেক্টরিটি বাদ দিয়ে .এবং ..সহ প্রবেশের সংখ্যা গণনা bashকরতে, আপনি এটি করতে পারেন:

shopt -s nullglob dotglob
set -- *
echo "$#"

Zsh সহ:

f=(*(ND))
echo $#f

Portably:

find . ! -name . -prune -print | grep -c /

আমি একটু বিভ্রান্ত; আপনি তালিকাবদ্ধ এই তিনটিই প্রকৃত গণিতে একটি যুক্ত করে। যেমন মনে হয় যদি আমি একটি ডিরেক্টরির মধ্যে 6 ফাইল বা ফোল্ডার, তারা আউটপুট 7, না 6. আমার কাছে আছে মত ls | wc -lশুধুমাত্র এক ব্যতীত .এবং..
আদম

1
@ অ্যাডাম, lsলুকানো ফাইলগুলি তালিকাবদ্ধ করে না। আপনি প্রয়োজন ls -Aযারা হিসাবে একই জন্য। আপনি, লুকানো ফাইল গণনা বন্ধ নেওয়া না চান তাহলে dotglob(ব্যাশ) অথবা D(জন্য zsh) অথবা একটি যোগ ! -name '.*'সামনে -printজন্য find
স্টাফেন চেজেলাস

হ্যাঁ, আমি আসলে ফাইলগুলি তালিকাভুক্ত করার পরে এটি লক্ষ্য করেছি। আপনি কি জানেন তবে কেন ls | wc -lএখনও আমাকে সঠিক উত্তর দেয় এবং লুকানো ফাইলগুলি বাদ দেয়, .& ..?
আদম

1
আদম, আপনার ডিরেক্টরির মধ্যে, আপনি ., ..এবং অন্য ফাইল যার নাম দিয়ে শুরু হয় ., যা ম দ্বারা তালিকায় না থাকে কিন্তু দ্বারা হবে ls -A। সুতরাং ls | wc -lআপনাকে সঠিক উত্তর দেয় না কারণ এটি that লুকানো ফাইল গণনা করছে না।
স্টাফেন চেজেলাস

1
হ্যাঁ, .এবং ..লুকানো ফাইলগুলি যেহেতু তারা একটি দিয়ে শুরু করে .। এমন কি কিংবদন্তি আছে যা ব্যাখ্যা করে যে ডটফিলগুলি দুর্ঘটনার দ্বারা গোপন করা হয়েছিল কারণ এর প্রাথমিক প্রয়োগ lsকেবলমাত্র বাদ দেওয়ার জন্য ছিল .এবং ..এটির মধ্যে একটি বাগ ছিল যার ফলে এটি শুরু হওয়া কোনও ফাইলকে বাদ দিতে পারে .ls | wc -lযদি ফাইলের নামগুলিতে নতুন লাইন অক্ষর থাকে তবে কাজ করে না।
স্টাফেন চেজেলাস

1

আমি কোনও লিনাক্স বিশেষজ্ঞ নই, তবে আমি জানি লিনাক্স (16 বছর আগে স্ল্যাকওয়্যারটিতে প্রশাসক হিসাবে ব্যবহৃত হত :) ভাল পুরানো সময়

./ এবং ../ ডিরেক্টরিগুলি সহজ:। বর্তমান ডিরেক্টরি, .. পূর্ববর্তী ডিরেক্টরি (পিডাব্লুডি-লোকাল ডিরেক্টরি কমান্ড-

এটি যদি তাদের গণনা করা হয় তবে আমি বিবেচনা করি তারা মোট তালিকার 2 টি যোগ করে, পুনরাবৃত্তভাবে না যায় এবং বর্তমানের নীচের ডিরেক্টরিটি গণনা করে এবং আবার বর্তমান ডিরেক্টরিটি (।) :) গণনা করে)

সুতরাং মূলত আমার মনে হয় এটি বর্তমান ডিরেক্টরিতে ইতিমধ্যে গণনা (ফাইল) 2 এর মান যোগ করে।

আমি ভুল হলে যে কেউ আমাকে সংশোধন করে।

আমি কেবল সাহায্য করার জন্য পোস্ট করছি এবং দেখেছি যে এখানে কেউই এই প্রশ্নের উত্তর দেয়নি, তারা ব্যস্ত থাকতে পারে। তবে কেবল পরীক্ষা করে দেখুন এবং আপনার কাছে 10 টি ফাইল রয়েছে এবং 12 টি গণনা পান তবে তা।


হ্যাঁ, অ্যাড্রিয়ান সঠিক:। হায়ারার্কির সাথে সাথে উপরের ডিরেক্টরিটি হ'ল বর্তমান ডিয়ার এবং ..।
স্কাইবা

.. গাছের সর্বদা পূর্ববর্তী ডিরেক্টরিটি উল্লেখ করে না: "/" ইন .. বর্তমান ডিরেক্টরিটিকেও বোঝায়।
বনসী স্কট 15

কারণ আপনি ফাইল সিস্টেমের / রুটে থাকতে পারেন?
অ্যাড্রিয়ান তানাসে

যদি এটি একটি ডিরেক্টরিতে ফাইলের # টিতে দুটি যুক্ত করে তবে আমি ওএসকে টার্মিনালে এটি পরীক্ষা করার সময় কেন সঠিক উত্তর পাচ্ছি? উদাহরণস্বরূপ 6 টি ফাইল বা ফোল্ডার সহ একটি ডিরেক্টরি যখন আমি করি তখন 8 নয়, 6 আউটপুট দেয়ls | wc -1
অ্যাডাম

আমি বুঝতে পেরেছিলাম যে এটি লুকিয়ে থাকা ফাইলগুলি (যেমন .d_store) ls | wc -lঅন্তর্ভুক্ত করছে তবে আমি এখনও দেখতে পাচ্ছি না যে কীভাবে অন্তর্ভুক্ত করা হয়েছে .এবং ..যখন আমি সঠিক উত্তরটি পাই, সঠিক উত্তর + ২ এর বিপরীতে
অ্যাডাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.