রিকারসিভ গ্লোব?


80

আমি এই জাতীয় কিছু লিখতে চাই:

$ ls **.py

সমস্ত .py ফাইলের নাম পেতে, পুনরাবৃত্তভাবে একটি ডিরেক্টরি শ্রেণিবদ্ধ পদচারণা।

এমনকি যদি .py ফাইলগুলি খুঁজে পেতে থাকে তবে শেল (ব্যাশ) এই আউটপুট দেয়:

ls: cannot access **.py: No such file or directory

আমি যা চাই তা করার কোনও উপায়?

সম্পাদনা: আমি উল্লেখ করতে চাই যে আমি নির্দিষ্ট ক্ষেত্রে আগ্রহী নই ls, তবে প্রশ্নটি গ্লোব সিনট্যাক্স সম্পর্কে।

উত্তর:


98

ব্যাশে পুনরাবৃত্ত গ্লোবগুলি করতে, আপনার globstarবাশ সংস্করণ 4 বা ততোধিক সংস্করণ থেকে বৈশিষ্ট্যটি প্রয়োজন ।

বাশ ম্যানপেজ থেকে:

globstar
    If set, the pattern ** used in a pathname expansion context will
    match all files and zero or more directories and subdirectories.
    If the pattern is followed by a /, only directories and
    subdirectories match.

আপনার উদাহরণ প্যাটার্ন জন্য:

shopt -s globstar
ls **/*.py

2
আমি আরও সক্রিয় করার পরামর্শ দেবnullglob
গ্লেন জ্যাকম্যান

6
@glennjackman তবে সক্ষম করার আগে nullglob, আমি নিম্নলিখিত সতর্কতাগুলি পড়ার দৃ strongly় পরামর্শ দেব ।
সার্জ Stroobandt

2
^ সতর্কতাগুলি এখানে চলে গেছে
বন্ধুরা

1
বাশ ৩.২ সহ, wc -l {**,.}/*.pyঠিকঠাক কাজ করে
রাফেল

@ রাফেল I প্রথমবার রিলিজ নোটগুলি পরীক্ষা করেছে এবং এটি অবশ্যই বলেছে যে এটি 4.0 এ চালু হয়েছিল। সম্ভবত আপনি বিতরণ এর জন্য একটি প্যাচ ব্যাকপোর্ট করেছেন? আইআইআরসি আরএইচএল 5 কিছু বৈশিষ্ট্য ব্যাকপোর্ট করেছে। আরও লক্ষণীয়, বাশ 4 মুক্তি পাওয়ার পরে 9 বছর হয়ে গেছে ...
জর্ডানম

10
find . -name '*.py'

** উভয়ই বর্তমান ডিরেক্টরিতে কাজ করে, একক * এর চেয়ে বেশি কিছু করে না


মজাদার. যদিও, আমি নিজেই গ্লোব সিনট্যাক্সের প্রতি আরও বেশি কেন্দ্রীভূত, কারণ আমাকে এটি একটি কনফিগারেশন ফাইলে ব্যবহার করতে হবে (নির্দেশাবলীর অন্তর্ভুক্ত)। আমার ফাইলগুলির একটি তালিকা দরকার নেই।
পাওলো

2
@ ডগ ও'নিল, এটি আর সত্য নয়। বাশ এখন সেই zsh বৈশিষ্ট্যটি অনুলিপি করেছে (যদিও এটি ksh93 এর কাছাকাছি একটি সিনট্যাক্স গ্রহণ করেছে এবং ksh এর মতো, zsh এর গ্লোব্বিং কোয়ালিফায়ারগুলিকে সমর্থন করে না যা এখনও এর উপযোগিতা সীমাবদ্ধ করে)
স্টাফেন চেজেলাস

findআপনার কাছে ব্যাশ না থাকলে আপনি প্রচুর কাজ করতে পারেন yourcommand `find . -name '*.py'`Ex উদাহরণ: (ব্যাকটিক্স নোট করুন); find . -name '*.py' -exec yourcommand {} \;
মঙ্গলবার

5

বাশ ৪ (যেহেতু জেডএস সহ) একটি নতুন গ্লোব্বিং বিকল্প ( globstar) যুক্ত করা হয়েছে যা **এটি সেট হওয়ার সাথে সাথে প্যাটার্নটির সাথে অন্যরকম আচরণ করে ।

এটি ওয়াইল্ডকার্ড প্যাটার্নের সাথে মিলছে এবং সেই ফাইল এবং ডিরেক্টরিগুলির নামগুলি মিলছে যা ম্যাচের আইটেমগুলির সাথে কমান্ডে ওয়াইল্ডকার্ড প্যাটার্নটি প্রতিস্থাপন করে match

সাধারণত আপনি যখন ব্যবহার করবেন **এটি এটির মতো কাজ করে *তবে এটি সমস্ত ডিরেক্টরিকে পুনরাবৃত্তি করে (লুপের মতো)।

এটি সক্ষম হয়েছে কিনা তা দেখতে এটি পরীক্ষা করে দেখুন shopt globstar(স্ক্রিপ্টিংয়ে, ব্যবহার করুন shopt -q globstar)।

উদাহরণটি **.pyকেবলমাত্র বর্তমান ডিরেক্টরিতে কাজ করবে, কারণ এটি যে ডিরেক্টরিগুলির পুনরাবৃত্তি হতে পারে তার তালিকাটি ফেরত দেয় না, এজন্য আপনাকে একাধিক ডিরেক্টরি-স্তরের ওয়াইল্ডকার্ড ব্যবহার **/*.pyকরতে হবে, সুতরাং এটি আরও গভীরতর হতে পারে।

দয়া করে তাই এটি কয়েক সিনট্যাক্স পরীক্ষা যা আমি সব ফাইল যাও recursively খোঁজার জন্য করেনি।

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