আপনি "দরিদ্র লোক find" এর প্রতি আগ্রহী হতে পারেন :
shopt -s globstar
shopt -s গুলি নামযুক্ত শেল বিকল্প (গুলি) এটস করে। globstarবিকল্প অনুসরণ হিসাবে সংজ্ঞায়িত করা হয় ব্যাশ (1) :
যদি সেট করা থাকে তবে **কোনও ফাইল নাম / পথের নাম প্রসারণ প্রসঙ্গে ব্যবহৃত প্যাটার্ন একটি ফাইলের সাথে মিলবে [sic] এবং শূন্য বা আরও ডিরেক্টরি এবং উপ ডিরেক্টরি irect যদি প্যাটার্নটি একটি দ্বারা অনুসরণ করা হয় তবে /কেবল ডিরেক্টরি এবং উপ-ডিরেক্টরি মেলে।
সুতরাং, আপনি কাজটি করার পরে shopt -s globstar, নিম্নলিখিত কমান্ডগুলির মধ্যে একটি:
ls -d1 - উত্স / ** # 'd' এর পরের অক্ষরটি হ'ল এক অঙ্ক।
ls -d - উত্স / ** | বিড়াল # অর্থাত্, এটি যে কোনও কমান্ডে পাইপে লিখবে।
প্রিন্টফ "% s \ n" উত্স / **
আউটপুট উত্পাদন করবে:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
দুর্ভাগ্যক্রমে, এর মধ্যে ডিরেক্টরিগুলির নামও অন্তর্ভুক্ত রয়েছে। এটি আপনাকে কিছুটা জানতে সাহায্য করতে পারে
printf "%s\n" source/**/
আউটপুট উত্পাদন করবে:
source/
source/fonts
source/images
যেমন, কেবল ডিরেক্টরি নাম names আপনি প্রথম কোনও কমান্ডের আউটপুটটিকে একটি ফাইলে পুনর্নির্দেশ করতে পারেন comm, উপরের আউটপুটটিকে একটি দ্বিতীয় ফাইলে পুনর্নির্দেশ করতে পারেন , diffএবং প্রথমটি থেকে দ্বিতীয় ফাইলটি বিয়োগ করতে কেবল, বা অনুরূপ কিছু ব্যবহার করুন , কেবল প্লেইন রেখে ফাইল (নন ডিরেক্টরি)। তবে তা করবেন না।
আরেকটি পদ্ধতির (যে খুব ভাল না ) হয়
ls -d --file-type -- source/** | grep -v '/$'
--file-typeবিকল্প বলে lsএকটি প্রদর্শন করে /
প্রতিটি ডিরেক্টরির নাম (এবং অন্যান্য (বিশেষ প্রান্ত) ফাইল ধরনের অন্য অক্ষর), ভালো শেষে:
উত্স // # একটি অতিরিক্ত একটি
উত্স / ফন্ট / # যোগ করা হয়েছে
উৎস / ফন্ট / fontello
উত্স / চিত্র / # যোগ করা হয়েছে
উৎস / ছবি / bg1.png
উৎস / ছবি / eng.png
উৎস / ছবি / fra.png
এবং তারপরে grep -v '/$'শেষ হওয়া লাইনগুলি সরিয়ে দেয় /; যেমন, ডিরেক্টরি নাম। দুর্ভাগ্যক্রমে, পসিক্স দ্বারা--file-type বিকল্পটি নির্দিষ্ট করা হয়নি । আপনার সংস্করণ যদি lsএটি সমর্থন না করে তবে ব্যবহার করুন -F। এটি --file-type
বাদে এটি *সম্পাদনযোগ্য ফাইলগুলির নামের শেষে একটি প্রদর্শন করে যা কিছু লোক বিরক্তিকর বলে মনে করে। আপনি এগুলি তাদের সাথে মুছে ফেলতে পারেন sed:
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
আপনি যদি সমস্ত ফাইল (এবং কেবলমাত্র ফাইলগুলি) দিয়ে কিছু করতে চান তবে আপনি এটি করতে পারেন
উত্স / ** এফ জন্য
করা
যদি [-f "$ f"]
তারপর
এখানে সরল ফাইলগুলিতে প্রয়োগ করার জন্য কমান্ডগুলি সন্নিবেশ করুন।
ফাই
সম্পন্ন
মন্তব্য:
- যখন
lsকোনও টার্মিনালে আউটপুট হয় এবং এটি -l( এল ওএনজি) মোডে থাকে না, তখন এটি প্রতি লাইনে একাধিক নাম লেখায় (নামগুলি দীর্ঘ না হলে)। আপনি এটিকে নির্দিষ্ট করে -1(এক) নির্দিষ্ট করে বা একটি ফাইল বা পাইপে আউটপুট পুনর্নির্দেশের মাধ্যমে প্রতি লাইনে একটি নাম লিখতে বাধ্য করতে পারেন ।
- আপনি সম্ভবত একটি নির্দেশিকা অন্তর্ভুক্ত
--করার প্রয়োজন নেই lsযেহেতু আপনি যে ডিরেক্টরিটি তৈরি করেছেন তার তালিকা তৈরি করছেন। *অজানা ডিরেক্টরিতে তালিকাভুক্ত করা ফাইল ফাইলগুলির বিরুদ্ধে সুরক্ষা হিসাবে আপনি এটি ব্যবহার করা উচিত -।
- এর থেকে আউটপুট পার্স করার চেষ্টা করবেন না
ls।
globstarশেল বিকল্প POSIX দ্বারা সংজ্ঞায়িত করা হবে না বলে মনে হচ্ছে। (বাস্তবে, আমি নিশ্চিত নই যে পসিক্স যে কোনও শেল বিকল্পকে স্বীকৃতি দিয়েছে )) এটি একটি bashশখের মতো বলে মনে হচ্ছে , সতর্ক থাকুন - এটি ব্যাশের সমস্ত সংস্করণে উপস্থিত নাও হতে পারে।
যদি fontsবা imagesউপ-ডিরেক্টরি থাকে তবে সমস্তগুলি নীচে, **পুনরাবৃত্তির সাথে তালিকাবদ্ধ করবে। গভীরতা সীমাবদ্ধ করার একটি (কিছুটা ক্লেদী এবং অবিশ্বস্ত) উপায়
ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
যা তিন বা ততোধিক অক্ষরযুক্ত লাইনগুলি সরিয়ে দেয় /।
findভুল ব্যবহারের উপায়ও রয়েছে ; বিশেষত, আপনি যদি চালাচ্ছেন তবে আপনিfor file in $(find ...)তাদের একটিকে আঘাত করেছেন)।