উত্তর:
find . -type d -execdir sh -c '
[ "$(find "$1" -maxdepth 1 -type f -name "*.txt" -print -quit | wc -l)" -gt 0 ] &&
[ "$(find "$1" -maxdepth 1 -type f ! -name "*.txt" -print -quit | wc -l)" -eq 0 ]
' find-sh {} \; -print
বাইরের find
সরবরাহের ডিরেক্টরিগুলি পরীক্ষা করতে হবে। দুই ভেতরের find
-s পরীক্ষা আছে যদি কমপক্ষে একটি .txt
ফাইল এবং কোন অ .txt
ডিরেক্টরির মধ্যে ফাইল। sh
শেল [ … ]
এবং সঙ্গে যুক্তি প্রয়োগ করে &&
।
নোট:
-maxdepth
পসিক্স দ্বারা প্রয়োজন হয় না। পসিক্স পদ্ধতির জন্য এই প্রশ্নটি দেখুন ।-quit
পসিক্স দ্বারা প্রয়োজন হয় না। find
যেকোন মিলে যাওয়া ফাইলের প্রতিবেদন হওয়ার সাথে সাথে এই ক্রিয়াটি প্রস্থান করে। এটি কার্যকর কারণ ফলাফলটি পেতে আমাদের বেশিরভাগ একটি মিলে যাওয়া ফাইলের প্রয়োজন wc -l
এবং [ … ]
তাই তাড়াতাড়ি ছাড়তে সময় সাশ্রয় হয়। -quit
পুরো কমান্ডটি ছাড়া কাজ করবে না, যখন অনেক ফাইল থাকবে তখন এটি ধীর হবে। বিকল্পভাবে আপনি ব্যবহার করতে পারেন find … | head -n 1 | wc -l
; এই ক্ষেত্রে head
পাইপটি প্রথম ফাইলটি সন্ধানের পরে বন্ধ করে wc
দেবে, এখনই ফলাফলটি find
দেবে , তবে কেবলমাত্র (যদি) এটি অন্য একটি লাইন লেখার চেষ্টা করবে তখন ভাঙা পাইপটি লক্ষ্য করবে । এবং এটি একটি বাণিজ্য বন্ধ: head
আপনার কিছু সময় এবং সংস্থান সাশ্রয় করতে পারে তবে (পৃথক প্রক্রিয়া হিসাবে) প্রতিটি ডিরেক্টরিতে দু'বার স্প্যান করার জন্য সময় এবং সংস্থান প্রয়োজন।wc -l
তবে তাতে কিছু আসে যায় না কারণ এই অতিরিক্ত নতুনলাইনগুলি কেবল "ডান" গণনাটি শূন্য নয় তবেই কেবল ফলাফলটি শূন্য কিনা তা আমাদের জানতে হবে the ।
find
, প্রার্থী ডিরেক্টরিগুলি অন্তত এই ধরণের ফাইল ধারণ করে এবং "কেবলমাত্র" শর্ত পরীক্ষা করে এমন স্ক্রিপ্টের মাধ্যমে আউটপুট পোস্ট-প্রক্রিয়া করি।