নির্দিষ্ট সংখ্যক ফাইলযুক্ত ডিরেক্টরিগুলি সন্ধান করুন


13

আশা করছিলাম যে আমি findকমান্ডটি দিয়ে এটি করতে সক্ষম হব তবে আমি যা চাই তা করার জন্য আমি ম্যানুয়ালটিতে কোনও পরীক্ষা দেখতে পাচ্ছি না। আমি ওয়ার্কিং ডিরেক্টরিতে এমন কোনও ডিরেক্টরি খুঁজে পেতে সক্ষম হতে চাই যাতে আমি উল্লেখ করে গণনা কম-বেশি, বেশি-বেশি বা ঠিক আছে।

find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries

তবে হায় এরকম বিকল্প নেই।


"ls -al | wc -l | grep" এর মতো কিছু চেষ্টা করুন
ভানাডিস

উত্তর:


16

সাব ডিরেক্টরি ডিরেক্টরি এবং সেগুলিতে থাকা ফাইল / ডিরেক্টরিগুলির সংখ্যা পেতে আপনি এটি চেষ্টা করতে পারেন:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

আপনি যদি সমস্ত সাব ডিরেক্টরিতে একই কাজ করতে চান তবে (পুনরাবৃত্তির সন্ধান করুন) পরিবর্তে এটি ব্যবহার করুন:

find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

ঠিক 10 টি ফাইল রয়েছে এমন ডিরেক্টরিগুলি নির্বাচন করতে:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
  awk '$NF==10'

10 বা আরও:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF>=10'

10 বা তার চেয়ে কম:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF<=10'

আপনি যদি কেবল ডিরেক্টরি নাম রাখতে চান (উদাহরণস্বরূপ আপনি এটি অন্য প্রসেসে নীচে প্রবাহিত করতে চান যেমন @ জৈবসৌপের পরামর্শ অনুযায়ী) আপনি এটি ব্যবহার করতে পারেন:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; | 
 awk -F"\t" '$NF<=10{print $1}'

1
আমি মনে করি ফাইল গণনা (যেমন শেষ শ্বেত স্পেস-বিস্মৃত কলাম) কেটে দেওয়ার জন্য awk কমান্ডটি অন্তর্ভুক্ত করা কার্যকর হতে পারে, যদি প্রশ্নকর্তা অন্য কোনও ক্ষেত্রে আউটপুটটি পাইপ করতে চান।
কুফলসপ

1
@ ইভিলসপ ভাল ধারণা, সম্পন্ন।
টেরডন

ডিরেক্টরি নাম সাদা স্থান এবং বিশেষ অক্ষর সমর্থন; একক এবং ডাবল উদ্ধৃতি যেমন ব্যবহারের পরিবর্তনের চেষ্টা করুন:find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
হ্যাভার্ড গীথাস

3

হুবহু $NUM ফাইলগুলি সহ তাত্ক্ষণিক সাব-ডিরেক্টরিগুলি তালিকাভুক্ত করা।

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]==num) printf "%s\n", line}'

তাত্ক্ষণিক সাব-ডাইরেক্টরিগুলি ফাইলের চেয়ে বৃহত্তর তালিকাবদ্ধ $NUMকরতে।

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]>num) printf "%s\n", line}'

তাত্ক্ষণিক ফাইলের চেয়ে কম সাবডিরেক্টরি তালিকা $NUMকরতে।

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]<num) printf "%s\n", line}'

আইটেমগুলি নাল অক্ষর দ্বারা সমাপ্ত করা হয় \0, সুতরাং ফাইলের নামগুলিতে নিউলাইনগুলি বা অন্যান্য ধরণের সাদা স্থান থাকা ফাইলগুলির সঠিক ব্যাখ্যা করা হবে। %hপ্রতিটি ফাইলের ছাপে dirnameawkতারপরে এটি প্রতিটি ডিরেক্টরিকে কতবার মুখোমুখি করে শর্তগুলি পূরণ করা হয় তা মুদ্রণ করতে একটি অ্যারে ব্যবহার করে।

দয়া করে নোট করুন যে পূর্বোক্ত নির্দেশাবলীর কোনওটিই শূন্য ফাইলযুক্ত ডিরেক্টরি প্রদর্শন করবে না। এছাড়াও মনে রাখবেন যে ফাইল দ্বারা আমি নিয়মিত ফাইল, উল্লেখ করছি না লিঙ্ক, ডিরেক্টরি, সকেট, ব্লক নাম পাইপ, ইত্যাদি।

আমি যথাসম্ভব সহজ করার চেষ্টা করেছি। আপনি যদি পুনরাবৃত্ত সাব-ডিরেক্টরি বা এতে ফাইলগুলি সন্ধান করতে চান তবে একটি পরিবর্তিত কমান্ডের প্রয়োজন। সেগুলি তালিকাভুক্ত করার জন্য অনেকগুলি সম্ভাবনা রয়েছে।


2

এটা চেষ্টা কর:

[`সন্ধান করুন। | wc -l` -eq 10] && এর প্রতিধ্বনি "পাওয়া গেছে"

[`সন্ধান করুন। | wc -l` -gt 10] && এর প্রতিধ্বনি "পাওয়া গেছে"

[`সন্ধান করুন। | wc -l` -lt 10] && এর প্রতিধ্বনি "পাওয়া গেছে"

এই উদাহরণগুলিতে আপনি পরীক্ষা করতে পারেন যে CURRENT ডিরেক্টরিতে ঠিক 10 রয়েছে, তারপরে আরও 10 এবং কম 10 টি ফাইল / ডিরেক্টরি রয়েছে। আপনার যদি গুচ্ছ ডিরেক্টরিগুলি পরীক্ষা করতে হয় তবে কেবল লুপ ব্যবহার করুন।


আপনার সমাধানটি বর্তমান ডিরেক্টরিকেও গণনা করে ( .), আপনি সেই অনুযায়ী সংশোধন করতে চাইতে পারেন।
টেরডন

আমি এই উত্তরের খোঁচা পছন্দ করি (কারণ আমি খোলের মধ্যে কাজ করার জন্য একটি পেটুক), তবে অযৌক্তিক কল এড়াতে আপনি পরীক্ষার ব্যবহার wc -l < <(printf %s\\n ./*)বা printf %s\\n ./* | wc -lঅভ্যন্তরের চেয়ে আরও ভাল find। এই ফলাফলটি অন্তর্ভুক্ত করার বিষয়ে @ ইটারডন যে সমস্যাটি লক্ষ্য করেছেন, তা এড়াবে .। তবে এটি একটি দিয়ে শুরু করে ফাইলগুলি উপেক্ষা করার সমস্যায় পড়ে .; আমি এটি দিয়ে সমাধান করব shopt -s dotglob(গ্লোবগুলির সাথে ফাইলগুলি ম্যাচ দিয়ে শুরু করতে ., তবে নয় .বা না ..)।
কুফলসপ

@terdon এটি গুরুত্বপূর্ণ নয়। এটি চূড়ান্ত সমাধান নয়, কেবল উদাহরণ, ধারণা। আপনি -1 করতে পারেন, বা চূড়ান্ত সংস্করণে 10 থেকে 11 পরিবর্তন করতে পারেন।
সেপ্টেম্বর

আমি জানি, এবং ধারণাটি ভাল তাই আমি পরামর্শটি দিয়েছিলাম।
টেরডন

@ টেরডন ধন্যবাদ. অনেকগুলি বিভিন্ন প্রয়োজনীয়তা থাকতে পারে, যেমন: কেবল ফাইলগুলি ডিরেক্টরি গণনা করুন তবে ডিরেক্টরি নয়, লিঙ্কগুলি বা শক্ত লিঙ্কগুলি। সাব-ডিরেক্টরিতে ফাইলগুলি গণনা করুন বা না করুন। লুকানো ফাইলগুলি গণনা করুন (যেমন। :)
সেপ্টেম্বর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.