উত্তর:
আমি ফেডোরায় আছি এবং এই ভয়েসপ্যাকগুলি কিছুটা আলাদা জায়গায় রয়েছে:
$ 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
কোন সংখ্যা যেখানে