উত্তর:
আমি ফেডোরায় আছি এবং এই ভয়েসপ্যাকগুলি কিছুটা আলাদা জায়গায় রয়েছে:
$ ls /usr/share/festival/lib/voices/*/ -1 | grep -vE "/usr|^$"
kal_diphone
ked_diphone
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_rms_arctic_hts
nitech_us_slt_arctic_hts
আপনি কেবল এটির মতো এটি পরিবর্তন করতে পারেন:
$ ls /usr/share/festival/voices/*/ -1 | grep -vE "/usr|^$"
lsএই ম্যানোরটিতে ব্যবহার করা সাধারণত ফাউন্ডড হয় কারণ আউটপুটকে lsবিশ্লেষণ করা শক্ত। findকমান্ডটি ব্যবহার করা ভাল , এর মতো:
$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
-type d -exec basename {} \;
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_slt_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_rms_arctic_hts
ked_diphone
kal_diphone
এই কমান্ডটি এই ডিরেক্টরিটির সাথে সঠিকভাবে 2 স্তরের গভীরতায় ফাইলগুলির সম্পূর্ণ পাথের একটি তালিকা তৈরি করে কাজ করে:
/usr/share/festival/lib/voices
এই তালিকাটি দেখে মনে হচ্ছে:
$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2
/usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_bdl_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_slt_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_jmk_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_clb_arctic_hts
/usr/share/festival/lib/voices/us/nitech_us_rms_arctic_hts
/usr/share/festival/lib/voices/english/ked_diphone
/usr/share/festival/lib/voices/english/kal_diphon
তবে আমরা এই ডিরেক্টরিগুলির শেষ অংশটি চাই, পাত নোড। সুতরাং আমরা basenameএটি বিশ্লেষণ করতে ব্যবহার করতে পারি :
$ basename /usr/share/festival/lib/voices/us/nitech_us_awb_arctic_hts
nitech_us_awb_arctic_hts
এগুলি একসাথে রেখে আমরা findকমান্ডটি প্রতিটি 2 স্তরের গভীর ডিরেক্টরি basenameকমান্ডের মধ্যে দিয়ে দিতে পারি। স্বরলিপিটি basename {}হল এই বেসনাম রূপান্তরগুলি কি করছে। এটি -execস্যুইচ হয়ে কল কল করুন ।
-exec basename {}করে তা খুঁজে বের করার সময় যারা বিভ্রান্ত হন , আপনি কি এখানে ব্যাখ্যা করতে পারেন?
find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h আকারে বাছাই করা বৃহত্তম ডিরেক্টরিগুলি সন্ধান করে
সবচেয়ে সহজ
ls -d /usr/share/festival/voices/*/*
এটি শেল দ্বারা সমস্ত উপ ডিরেক্টরিগুলির মধ্যে /usr/share/festival/voices/এবং তারপরে সেই সমস্ত ডিরেক্টরি ডিরেক্টরিগুলির সামগ্রীতে বিস্তৃত হয় ।
আপনার শিরোনামের পরামর্শ অনুসারে আপনি যদি কেবলমাত্র একটি নির্দিষ্ট স্তরে নামতে findচান তবে জিএনইউ এবং কিছু বিএসডি'র মতো কিছু বাস্তবায়ন সহ :
find /usr/share/festival/voices/ -mindepth 2 -maxdepth 3 -type d
এটি সমস্ত ডিরেক্টরি ( -type d) যা একটি উপ-ডিরেক্টরিতে /usr/share/festival/voices/রয়েছে mindepth 2তবে এটি 3 স্তরের ( maxdepth 3) এর চেয়ে গভীর নয় । থেকে man find:
-maxdepth levels
Descend at most levels (a non-negative integer) levels of direc‐
tories below the command line arguments. -maxdepth 0
means only apply the tests and actions to the command line
arguments.
-mindepth levels
Do not apply any tests or actions at levels less than levels (a
non-negative integer). -mindepth 1 means process all files
except the command line arguments.
-type fকরা -type dউচিত , তাই না? এছাড়াও উদ্দেশ্য সংক্রান্ত SLM প্রতিক্রিয়া অপেক্ষা করবে-exec basename {}
-type dডিরেক্টরিগুলি পাবেন। basenameএকটি খুব ভাল ধারণা, এটি শুধুমাত্র নাম মুদ্রণ এবং পথ মুছে ফেলা হবে। ধরে নিচ্ছি যে আপনি কেবল নাম চান, এটি আপনার করা উচিত। দেখুন man basenameএবং এছাড়াও man dirname।
গৃহীত উত্তর সঠিকভাবে কাজ করে কিন্তু কিছুটা অদক্ষ কারণ এটি একটি নতুন spawns basenameপ্রতিটি সাব প্রক্রিয়া:
find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
-type d -exec basename {} \;
যখন সম্ভব হয়, findস্প্যানিং প্রক্রিয়াগুলির ব্যয় এড়াতে অন্তর্নির্মিত বৈশিষ্ট্যগুলি ব্যবহার করা ভাল । ক্রিয়াটি findব্যবহার করে এর মুদ্রিত আউটপুট পরিবর্তন করতে যথেষ্ট বিস্তৃত ক্ষমতা রয়েছে -printf। ডিফল্ট -print
ক্রিয়াটি পুরো পথটি মুদ্রণ করে তবে -printfএকটি বিন্যাসের স্ট্রিং ব্যবহার করে এবং মুদ্রণের জন্য পথের অংশগুলি নির্বাচন করা সম্ভব। শীর্ষস্থানীয় ডিরেক্টরিগুলি (যেমন basename
আছে) ছাড়া পথের কেবল ফাইল নাম অংশটি বের করতে , বিন্যাস স্ট্রিং %f। প্রতিটি ফাইলের নামের পরে একটি নতুন লাইন স্থাপন করতে, \nনিম্নলিখিত হিসাবে অন্তর্ভুক্ত করুন :
$ find /usr/share/festival/lib/voices -maxdepth 2 -mindepth 2 \
-type d -printf '%f\n'
nitech_us_awb_arctic_hts
nitech_us_bdl_arctic_hts
nitech_us_slt_arctic_hts
nitech_us_jmk_arctic_hts
nitech_us_clb_arctic_hts
nitech_us_rms_arctic_hts
ked_diphone
kal_diphone
findস্বেচ্ছাসেবী বাহ্যিক আদেশের সাহায্যে আরও সাধারণ প্যাটার্নটি কভার করা হয়েছে ; এটা শুধু কম অপারেশন যে পাতাটা জন্য কার্যকর find। আমি তার উত্তরে একটি মন্তব্য যুক্ত করার বিষয়টি বিবেচনা করেছি, তবে এর জন্য আমার চেয়ে বেশি খ্যাতি দরকার। আপনার গৃহীত উত্তর পরিবর্তন করার দরকার নেই, কারণ বর্তমানে গৃহীত উত্তর সঠিক, ভালভাবে ব্যাখ্যা করা হয়েছে এবং আরও সাধারণ মামলার নিদর্শন হিসাবে ব্যবহারযোগ্য; আমি কেবল উল্লেখ করতে চেয়েছিলাম যে এই নির্দিষ্ট ক্ষেত্রে আরও কার্যকর পদ্ধতি আছে।
TLDR; এই প্রশ্নের শিরোনামের ভিত্তিতে যারা এখানে আসছেন তাদের জন্য ; "সাব-ডাইরেক্টরিগুলি কেবলমাত্র n স্তরের গভীর তালিকাবদ্ধ করতে": ব্যবহার করুন
find -maxdepth N
Nকোন সংখ্যা যেখানে