সংক্ষিপ্ত উত্তর:
\ls -afq | wc -l
(এর মধ্যে রয়েছে .
এবং ..
তাই বিয়োগ 2)
আপনি যখন কোনও ডিরেক্টরিতে ফাইলগুলি তালিকাভুক্ত করেন, তখন তিনটি সাধারণ জিনিস ঘটতে পারে:
- ডিরেক্টরিতে ফাইলের নাম গণনা করা হচ্ছে। এটি অপরিবর্তনীয়: কোনও ডিরেক্টরিতে ফাইলগুলি গণনা না করে কোনও সংখ্যা গণনা করার উপায় নেই।
- ফাইলের নাম বাছাই করা হচ্ছে। শেল ওয়াইল্ডকার্ড এবং
ls
কমান্ড এটি করে।
stat
প্রতিটি ডিরেক্টরি এন্ট্রি সম্পর্কিত মেটাডেটা পুনরুদ্ধার করার জন্য কল করা, যেমন এটি ডিরেক্টরি কিনা।
# 3 এখন পর্যন্ত সবচেয়ে ব্যয়বহুল, কারণ এটি প্রতিটি ফাইলের জন্য একটি ইনোড লোড করা প্রয়োজন। তুলনায় তুলনা করে # 1 এর জন্য প্রয়োজনীয় সমস্ত ফাইলের ফাইলগুলি কয়েকটি ব্লকে নিখুঁতভাবে সংরক্ষণ করা হয়েছে। # 2 কিছু সিপিইউ সময় নষ্ট করে তবে এটি প্রায়শই ডিল ব্রেকার হয় না।
যদি ফাইলের নামগুলিতে কোনও নতুন লাইন না থাকে তবে একটি সরল ডিরেক্টরি ls -A | wc -l
আপনাকে জানায় যে ডিরেক্টরিতে কতগুলি ফাইল রয়েছে। সাবধান হন যে আপনার যদি একটি উপাধি রয়েছে তবে এটি ls
কলটি কল করতে পারে stat
(উদাহরণস্বরূপ ls --color
বা ls -F
ফাইলের প্রকারটি জানতে হবে, যার জন্য একটি কল প্রয়োজন stat
), সুতরাং কমান্ড লাইন থেকে, কল করুন command ls -A | wc -l
বা \ls -A | wc -l
একটি উপনাম এড়ানোর জন্য।
যদি ফাইলের নামে নতুন লাইন থাকে তবে নতুন লাইনগুলি তালিকাভুক্ত কিনা তা ইউনিক্স ভেরিয়েন্টের উপর নির্ভর করে। ?
একটি নতুন লাইনের জন্য প্রদর্শিত GNU কোর্টিলস এবং ব্যাসিবক্স ডিফল্ট , যাতে তারা নিরাপদ থাকে।
ls -f
এন্ট্রিগুলি বাছাই না করে তাদের তালিকা করতে কল করুন (# 2) এটি স্বয়ংক্রিয়ভাবে চালু হয় -a
(কমপক্ষে আধুনিক সিস্টেমে)। -f
বিকল্প POSIX কিন্তু ঐচ্ছিক অবস্থা সঙ্গে আছেন | বেশিরভাগ বাস্তবায়ন এটিকে সমর্থন করে তবে ব্যাসিবক্স নয়। বিকল্পটি -q
মুদ্রণযোগ্য অক্ষরের পরিবর্তে নিউলাইনগুলি সহ প্রতিস্থাপন করে ?
; এটি পসিক্স তবে ব্যাসিবক্স দ্বারা সমর্থিত নয়, সুতরাং আপনার যদি অতিরিক্ত ফাইলের ব্যয়ে ব্যাসিবক্স সমর্থন প্রয়োজন হয় তবে যার নামটিতে একটি নতুন লাইন অক্ষর রয়েছে it
যদি ডিরেক্টরিটির কোনও উপ-ডিরেক্টরি না থাকে, তবে বেশিরভাগ সংস্করণে তার এন্ট্রিগুলিতে find
কল stat
করা হবে না (লিফ ডিরেক্টরি ডিরেক্টরি অপ্টিমাইজেশন: ২ টির একটি লিঙ্ক গণনা রয়েছে এমন ডিরেক্টরিতে সাব-ডিরেক্টরি থাকতে পারে না, সুতরাং find
এন্ট্রিগুলির মেটাডেটা সন্ধান করার প্রয়োজন নেই যদি না শর্ত যেমন -type
এটি প্রয়োজন)। সুতরাং find . | wc -l
পোর্টেবল, দ্রুত প্রদান করা ডিরেক্টরিটি কোন সাবডিরেক্টরি এবং কোন ফাইলের নাম একটি newline রয়েছে সেটা একটি ডিরেক্টরির মধ্যে ফাইল গণনা উপায়।
ডিরেক্টরিতে যদি উপ-ডিরেক্টরি না থাকে তবে ফাইলের নামগুলিতে নতুন লাইন থাকতে পারে, এর মধ্যে একটি ব্যবহার করে দেখুন (দ্বিতীয়টি যদি এটি সমর্থন করে তবে দ্রুত হওয়া উচিত, তবে এটি সম্ভবত লক্ষ্যণীয় নয়)।
find -print0 | tr -dc \\0 | wc -c
find -printf a | wc -c
অন্যদিকে, find
ডিরেক্টরিটিতে সাব-ডিরেক্টরি থাকলেও ব্যবহার করবেন না : এমনকি প্রতিটি এন্ট্রিতেও find . -maxdepth 1
কল stat
করুন (কমপক্ষে জিএনইউ সন্ধান এবং ব্যাসিবক্স অনুসন্ধান সহ)। আপনি বাছাই এড়ান (# 2) তবে আপনি একটি ইনোড লুপ (# 3) এর মূল্য প্রদান করেন যা কার্য সম্পাদন করে।
বাহ্যিক সরঞ্জাম ছাড়া শেলটিতে আপনি বর্তমান ডিরেক্টরিতে ফাইলগুলি গণনা দিয়ে চালাতে পারেন set -- *; echo $#
। এটি বিন্দু ফাইলগুলি (যাদের নাম দিয়ে শুরু হওয়া ফাইলগুলি .
) মিস করে এবং খালি ডিরেক্টরিতে 0 এর পরিবর্তে 1 টি প্রতিবেদন করে। এটি ছোট ডিরেক্টরিতে ফাইলগুলি গণনা করার দ্রুততম উপায় কারণ এটিতে কোনও বাহ্যিক প্রোগ্রাম শুরু করার প্রয়োজন হয় না, তবে (zsh ব্যতীত) বাছাইকরণের ধাপের কারণে বৃহত্তর ডিরেক্টরিগুলির জন্য সময় নষ্ট হয় (# 2)।
ব্যাশে, এটি বর্তমান ডিরেক্টরিতে ফাইলগুলি গণনা করার একটি নির্ভরযোগ্য উপায়:
shopt -s dotglob nullglob
a=(*)
echo ${#a[@]}
Ksh93 এ, বর্তমান ডিরেক্টরিতে ফাইলগুলি গণনা করার এটি একটি নির্ভরযোগ্য উপায়:
FIGNORE='@(.|..)'
a=(~(N)*)
echo ${#a[@]}
Zsh এ, এটি বর্তমান ডিরেক্টরিতে ফাইলগুলি গণনা করার একটি নির্ভরযোগ্য উপায়:
a=(*(DNoN))
echo $#a
আপনি যদি mark_dirs
বিকল্প সেট, এটিকে বন্ধ করতে নিশ্চিত করুন: a=(*(DNoN^M))
।
যে কোনও পসিক্স শেল এ, বর্তমান ডিরেক্টরিতে ফাইলগুলি গণনা করার এটি একটি নির্ভরযোগ্য উপায়:
total=0
set -- *
if [ $# -ne 1 ] || [ -e "$1" ] || [ -L "$1" ]; then total=$((total+$#)); fi
set -- .[!.]*
if [ $# -ne 1 ] || [ -e "$1" ] || [ -L "$1" ]; then total=$((total+$#)); fi
set -- ..?*
if [ $# -ne 1 ] || [ -e "$1" ] || [ -L "$1" ]; then total=$((total+$#)); fi
echo "$total"
এই সমস্ত পদ্ধতিতে zsh নাম বাদে ফাইলের নামগুলি বাছাই করা হয়।
ls -l|wc -l
ls -l
আউটপুট প্রথম লাইনের মোট ব্লকগুলির কারণে এক এক হয়ে যাবে