গ্লোব প্যাটার্ন প্রসারিত করার সেরা উপায়?


29

প্রোগ্রামের মতো ফাইলগুলির তালিকায় আমার একটি গ্লোব প্যাটার্ন (যেমন ../smth*/*বা /etc/cron*/) প্রসারিত করতে হবে । এটি করার সর্বোত্তম উপায় কী হবে?


2
আপনার বিশেষ কিছু করার দরকার নেই, কেবল উদ্ধৃত করবেন না *
কেভিন

1
যদিও আপনি এটি বিশ্লেষণের চেষ্টা করতে যাচ্ছেন তবে উত্তর বলার মতো একটি অ্যারে ব্যবহার করুন।
কেভিন

উত্তর:


40

কেবল এটি অ্যারে ডিক্লেয়ারেশনের ডান দিকের ভিতরে প্রসারিত করুন:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


মনে রাখবেন যে শেল বিকল্পটি nullglobসেট করা দরকার।
এটি ডিফল্টরূপে সেট করা নেই।
গ্লোব (বা একাধিক গ্লোবগুলির একটি) কোনও নামের সাথে মেলে না এমন ক্ষেত্রে এটি একটি ত্রুটি প্রতিরোধ করে।

bashসাথে এটি সেট করুন

shopt -s nullglob

বা zshসাথে

setopt nullglob

এবং তারপরে আমি কীভাবে তালিকাটি মুদ্রণ করব?
রোগাচ

এটি কেবল একটি নিয়মিত অ্যারে। আপনি যে কোনও অ্যারে দিয়ে যা পারেন তা করতে পারেন। কিছু উদাহরণ যুক্ত করা হয়েছে।
manatwork

1
একটি সমস্যা আছে. যদি প্যাটার্ন কোনও ফাইলের সাথে মেলে না, তবে এটি নিজেই মুদ্রণ করে - যা খুব ভাল নয়।
রোগাচ

5
আহ, শপট-এস নলগ্লোব এটি সমাধান করে।
রোগাচ

1
@ লিঙ্ক, unsetoptএবং একই প্যারামিটারটির জন্য ব্যবহৃত setopt
manatwork

0

জিনিসগুলিকে অত্যধিক জটিল করার দরকার নেই:

echo your/stuff*

এটি কাজ করে না। উদাহরণস্বরূপ: TEST=$(echo your/stuff*) && eval \"$TEST\"আউটপুট হবে:your/stuff*: No such file or directory
সেবাস্তিয়ান

@ সেবাস্তিয়ান এটি নালাগ্রস্ত ইস্যু, উপরে দেখুন
আলেক্সি আভারচেঙ্কো

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