সাব-ডাইরেক্টরিগুলি তালিকাভুক্ত করুন কেবলমাত্র n স্তর


58

উত্সবটি নিম্নলিখিত উদাহরণ ডিরেক্টরি কাঠামোতে ভয়েসপ্যাকের ডেটা সঞ্চয় করে:

/usr/share/festival/voices/<language>/<voicepack name>

সমস্ত সম্ভাব্য অসংখ্য সাব-ডিরেক্টরিতে lsকেবল প্রিন্ট আউট করার জন্য সবচেয়ে সহজ ওয়ান-লাইনার (পছন্দসইভাবে ব্যবহার করা ) কী?<voicepack name><language>

উত্তর:


80

আমি ফেডোরায় আছি এবং এই ভয়েসপ্যাকগুলি কিছুটা আলাদা জায়গায় রয়েছে:

$ 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স্যুইচ হয়ে কল কল করুন ।


তোমার, প্রায় কাছাকাছি ঠিক একই উত্তর, মহান হৃদয় ও মন জয় এবং যা :)।
টেরডন

+1 - যারা কী -exec basename {}করে তা খুঁজে বের করার সময় যারা বিভ্রান্ত হন , আপনি কি এখানে ব্যাখ্যা করতে পারেন?
ব্যবহারকারী 66001

@ ব্যবহারকারী 66001 - যদি এটির যথেষ্ট ব্যাখ্যা করে তবে আমাকে জানান।
slm

@ user66001 - আপনি উত্তর এক গ্রহণ করতে পারে এটি আপনার satisfication 8- আপনার সমস্যা solves)
SLM

1
অনুসন্ধান কমান্ডটি আমার 99% সময় প্রয়োজন। সর্বাধিক এবং মিনিট উভয়ই সীমাবদ্ধ করানো ছিল - আমি কেবল সর্বোচ্চ করেছি did উদাহরণ: find ~/ -maxdepth 1 -mindepth 1 -type d | xargs du -csh | sort -h আকারে বাছাই করা বৃহত্তম ডিরেক্টরিগুলি সন্ধান করে
অলিগোফ্রেন

23

সবচেয়ে সহজ

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.

হ্যাঁ এটি আয়নায় দেখার মতো 8-)
স্ল্যাম

+1 আপনি দু'জন কীভাবে 2 ভোট পেয়েছেন তা আকর্ষণীয়। ক্রস ভোটিং 1 টি 1 টি ব্যাখ্যা করে;) পিএস আমি ডিরেক্টরিগুলির নাম চেয়েছিলাম, তাই কেবল এটির সমাধান -type fকরা -type dউচিত , তাই না? এছাড়াও উদ্দেশ্য সংক্রান্ত SLM প্রতিক্রিয়া অপেক্ষা করবে-exec basename {}
user66001

@ user66001 হ্যাঁ, -type dডিরেক্টরিগুলি পাবেন। basenameএকটি খুব ভাল ধারণা, এটি শুধুমাত্র নাম মুদ্রণ এবং পথ মুছে ফেলা হবে। ধরে নিচ্ছি যে আপনি কেবল নাম চান, এটি আপনার করা উচিত। দেখুন man basenameএবং এছাড়াও man dirname
টেরডন

ধন্যবাদ টেরডন - উত্তর হিসাবে আপনার চিহ্ন হিসাবে চিহ্নিত না করার জন্য দুঃখিত। অনুভূত SLM এর বর্তমান সংস্করণটি যে এর আরও তথ্য রয়েছে, যারা এটি প্রয়োজন যে জন্য।
ব্যবহারকারী 66001

1
@ ব্যবহারকারীর66001 সবার আগে আপনি একদম ঠিক বলেছেন, স্ল্যাম এর চেয়ে ভাল। দ্বিতীয়ত আপনাকে কখনই গ্রহণ না করার জন্য ক্ষমা চাওয়া উচিত নয়, কেবলমাত্র একটিই হতে পারে এবং এটিই আপনি ভাল বিবেচনা করবেন should
টেরডন

6

গৃহীত উত্তর সঠিকভাবে কাজ করে কিন্তু কিছুটা অদক্ষ কারণ এটি একটি নতুন 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

+1 আপনার উত্তরের জন্য ধন্যবাদ মাইকেল। আমি আপনার উত্তরে এটি করার পদ্ধতিটির সুবিধাটিও দেখতে পাচ্ছি, তবে স্ল্যাম এর উত্তরে দেওয়া কাজটি আমি গ্রহণযোগ্য উত্তরটি স্যুইচ করার বিষয়ে দুটি মনেই আছি। যদি @ এসএলএম এটি দেখে এবং তার থেকে এটি বেছে নেওয়ার কোনও সমস্যা না থাকে তবে আমি স্বীকৃত উত্তরটি পরিবর্তন করতে এখানে ফিরে আসব।
ব্যবহারকারী 66001

1
@ এসএমএল এর উত্তরটি ভালভাবে ব্যাখ্যা করা হয়েছে এবং findস্বেচ্ছাসেবী বাহ্যিক আদেশের সাহায্যে আরও সাধারণ প্যাটার্নটি কভার করা হয়েছে ; এটা শুধু কম অপারেশন যে পাতাটা জন্য কার্যকর find। আমি তার উত্তরে একটি মন্তব্য যুক্ত করার বিষয়টি বিবেচনা করেছি, তবে এর জন্য আমার চেয়ে বেশি খ্যাতি দরকার। আপনার গৃহীত উত্তর পরিবর্তন করার দরকার নেই, কারণ বর্তমানে গৃহীত উত্তর সঠিক, ভালভাবে ব্যাখ্যা করা হয়েছে এবং আরও সাধারণ মামলার নিদর্শন হিসাবে ব্যবহারযোগ্য; আমি কেবল উল্লেখ করতে চেয়েছিলাম যে এই নির্দিষ্ট ক্ষেত্রে আরও কার্যকর পদ্ধতি আছে।
মাইকেল হেনরি

0

TLDR; এই প্রশ্নের শিরোনামের ভিত্তিতে যারা এখানে আসছেন তাদের জন্য ; "সাব-ডাইরেক্টরিগুলি কেবলমাত্র n স্তরের গভীর তালিকাবদ্ধ করতে": ব্যবহার করুন

find -maxdepth N

Nকোন সংখ্যা যেখানে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.