আমি কি বাশ গ্লোব থেকে কেবল একটি ফলাফল নির্বাচন করতে পারি?


14

আমি আউটপুট সম্পর্কে কিছু প্রতিবেদন স্বয়ংক্রিয় করতে কাজের জন্য একটি স্ক্রিপ্ট লেখার চেষ্টা করছি। লগ ফাইলগুলি (বর্তমানে, ভবিষ্যতে এটি 'মানীকৃত' হচ্ছে) এই ধরণের পাথ কাঠামোর মধ্যে সংরক্ষণ করা হয়েছে:

/<root_path>/<process_one_path>/logs/<time_date_stamp>/<specific_log_file>

/<root_path>/<process_two_path>/logs/<different_time_date_stamp>/<specific_log_file>

পথের প্রতিটি অংশই সময় তারিখের স্ট্যাম্পগুলি বাদে জানা যায় যা ফোল্ডারে সর্বদা সর্বশেষ।

যদি আমি সময় তারিখের স্ট্যাম্পের জায়গায় ওয়াইল্ড কার্ড ব্যবহার করার চেষ্টা করি তবে আমি একাধিক ফলাফল পেয়েছি, যেমন:

> ls /<root_path>/<process_two_path>/logs/* [tab]
20130102-175103
20130118-090859
20130305-213506

আমি কেবল এটি সর্বশেষতমটি ফিরিয়ে দিতে চাই, বাশের সাথে এটি কি সম্ভব?

এনবি (আমার কাছে জেডএস নেই, এবং যত সুন্দর মনে হচ্ছে আমি সন্দেহ করি যে আমরা এটি কখনই কাজে পাব)

উত্তর:


9

নিম্নলিখিত বাশ 4.2 এ কাজ করে:

list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[-1]}"

যদি আপনার বাশটি পুরানো সংস্করণ হয়:

list=( /<root_path>/<process_two_path>/logs/* )
echo "${list[${#list[@]}-1]}"

এটি অবশ্যই আমার বাড়ির কম্পিউটারে কাজ করে তবে আমি নিশ্চয়তা দিতে পারি না যে এটি কাজ করবে?
পিওরফেরেট

@ পিফেরফেরেট অংশটি যা কাজ করতে পারে না তা হ'ল নেতিবাচক অ্যারে সূচক ( -1)। এটি ব্যাশ ৪.২ এ যোগ করা হয়েছে। RHEL5 সম্ভবত প্রাচীনতম সমর্থিত মূলধারার এন্টারপ্রাইজ ডিস্ট্রো উপলভ্য এবং এটি ব্যাশ 4.2.20 ব্যবহার করে।
প্যাট্রিক

1
এর পুরানো সংস্করণগুলি bash: "${list[@]: -1}"লাইক ইন ksh93( [-1]থেকে আসে zsh)।
স্টাফেন চেজেলাস

@ পেট্রিক - আরএইচইল 5 ব্যাশ ব্যবহার করে 3.2। RHEL 3 এবং 4 এখনও বর্ধিত জীবনের অধীনে সমর্থিত।
jordanm

1
@ শুফফেরেট আপনি অ্যারে দৈর্ঘ্যের সাথে পাটিগণিতও করতে পারেন, আমার সম্পাদনা দেখুন।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'


4

লুপের জন্য একটি ব্যাশে ব্যাশ গ্লোব ব্যবহার করুন। এটার মত:

for filename in <logdir>/*; do :; done; echo "$filename"

এটি নির্ভর করে যে বাশ গ্লোব সম্প্রসারণ বর্ণানুক্রমিকভাবে বাছাই করে। আরও তথ্যের জন্য বাশ ম্যানুয়াল পড়ুন । নোট করুন যে এটি LC_COLLATE এর উপর নির্ভর করে । এটি filenameলুপটি সমাপ্ত হওয়ার পরেও ভেরিয়েবলের সর্বশেষ মানটি রয়েছে তার উপরও এটি নির্ভর করে ।

আপনি যদি প্রাচীনতম টাইমস্ট্যাম্পের সাথে ফাইলের নামটি চান তবে আপনি এটি এটি করতে পারেন:

for filename in <logdir>/*; do echo "$filename"; break; done

1

পাইপলাইনগুলিতে -1 ডিফল্ট এবং ls আউটপুট ইতিমধ্যে বাছাই করা উচিত:

ls | tail -n1

অন্যরা যদি ইন্টারেক্টিভভাবে কীভাবে প্রথম বা শেষ ফলাফল সন্নিবেশ করানোর জন্য সন্ধান করছিলেন, আপনি মেনু-সম্পূর্ণ বা মেনু-সম্পূর্ণ-পিছনে ইন ইনপুটসি-তে বাঁধতে পারেন:

"\e\t": menu-complete
"\e[Z": menu-complete-backward # shift-tab

যদি সমস্ত-যদি-অস্পষ্ট দেখানো সক্ষম হয়, set completion-query-items 0101 বা ততোধিক ফলাফল পাওয়া যায় তখন প্রম্পটটি সরিয়ে দেয় এবং set page-completions offপেজারটি অক্ষম করে।


-1
ls -tr | tail -1

কৌতুক করা উচিত।



তা কেন? এবং গ্লোব থেকে আউটপুট ব্যবহার করা থেকে এটি কীভাবে আলাদা?
স্লিপসেট

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