Zsh এ লিকক্সোগ্রাফিক ক্রমে ফাইলের মাল্টিডিজিট রেঞ্জ


24

আমি গ্লোব্বিং করে zsh এ দুটি পূর্ণসংখ্যার (উদাহরণস্বরূপ 2 থেকে 57) বিস্তৃত ফাইল (অভিধানের ক্রমে) নির্দিষ্ট করতে চাই।

উদাহরণস্বরূপ: "কিছু গ্লোব্বিং প্যাটার্নের সাথে মেলে এমন পথের নীচে 2 থেকে 57 শব্দকোষগুলিতে ফাইলগুলি চয়ন করুন" pick

আমি ভেবেছিলাম বর্গাকার বন্ধনী ব্যবহার করে এটি করা হবে

 for x in /foo/bar/*[2-57]; do print $x; done

কিন্তু zsh দৃশ্যত মনে করে আমি ফাইলে জিজ্ঞাসা করছি 2করার 5(বা ওই জাতীয় কিছু) পরিবর্তে ফাইল 2থেকে 57। কোন চিন্তা কেন? আমি কীভাবে এটি সম্পাদন করতে পারি?

উত্তর:


30

[2-57]একটি অক্ষর সম্বলিত সেট 2, 3, 4, 5এবং 7সেখানে zsh এবং প্রত্যেক অন্যান্য ওয়াইল্ডকার্ড এবং regexp সিনট্যাক্স আউট। আপনার গ্লোব প্যাটার্ন *[2-57]প্রতিটি ফাইলের সাথে মেলে যার শেষ অক্ষর সেই পাঁচটি সংখ্যার মধ্যে একটি।

আমি মনে করি আপনি গ্লোব [m,n] কোয়ালিফায়ারের সিনট্যাক্সকে ভুলভাবে বিবেচনা করছেন । গ্লোব কোয়ালিফায়াররা সর্বদা প্যাটার্নের শেষে বন্ধনীতে যায়, এবং পরিসীমা বিভাজক একটি কমা। প্যাটার্নটি *([2,57])দ্বিতীয়, তৃতীয়,…, 57 তম ম্যাচে প্রসারিত। ডিফল্ট সম্প্রসারণ ক্রমটি শব্দের সাথে সম্পর্কিত হয় ( numeric_glob_sortবিকল্পটি সেট করা থাকলে সংখ্যার সাথে সারণিতে কিছু বিশেষ যাদু সহ ); আপনার সাথে নিয়ন্ত্রণ করতে পারেন oবা Oউল্লিখিত glob কোয়ালিফায়ার (যেমন *(om[2,57])এক সাম্প্রতিকতম ফাইল ছাড়া 57 সাম্প্রতিকতম ফাইল মেলে)।

for x in /foo/bar/*([2,57]); do print $x; done

আপনি যা চেয়েছিলেন তা নয়, তবে ভবিষ্যতের পাঠকদের জন্য সম্পর্কিত এবং সম্ভবত দরকারী: আপনি যদি ফাইলগুলি 2 থেকে 57 এর মধ্যে উপস্থিত থাকেন বা না থাকুক তবে তার পরিসীমা ব্রেস এক্সপ্রেশন ব্যবহার করতে পারেন । এই বৈশিষ্ট্যটি bash এবং ksh এও বিদ্যমান।

echo hello{2..57}

এবং যদি আপনি এমন ফাইলগুলির সাথে মিল রাখতে চান যার নামটিতে 2 থেকে 57 এর মধ্যে একটি সংখ্যা থাকে তবে আপনি প্যাটার্নটি ব্যবহার করতে পারেন <2-57>। এটি zsh এর জন্য নির্দিষ্ট।

$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57

নোট করুন যে কোনও প্যাটার্নটি *<2-57>সম্ভবত আপনি যা প্রত্যাশা করেন তা না করায় কারণ *অঙ্কগুলিও মেলে। উদাহরণস্বরূপ, file58ম্যাচ *<2-57>, সঙ্গে file5মিলে *অংশ এবং 8মিলে <2-57>অংশ। প্যাটার্নটি *[^0-9]<2-57>এই সমস্যাটিকে এড়িয়ে চলে।


তুমি ঠিক. আমি গ্লোব কোয়ালিফায়ারকে মিস করছিলাম। সাবধানে ব্যাখ্যার জন্য ধন্যবাদ।
— আমেলিও ওয়াজকেজ-রেইনা

উপায় দ্বারা, এই বিবৃতি আমাকে একটু বিভ্রান্ত করেছেন: if you want to enumerate files 2 to 57 whether they exist or not, you can use a range brace expression। যদি ফাইলগুলির অস্তিত্ব না থাকে এবং কোনও মিল নেই, তবে বন্ধনী সম্প্রসারণ কীভাবে প্রসারিত হবে তা কীভাবে জানবে? (এটি কীভাবে গ্লোব কোয়ালিফায়ার থেকে আলাদাভাবে প্রসারিত হবে?)
— আমেলিও ওয়াজকেজ-রেইনা

2
@intrpc এর foo{8..11}barপ্রসারিত হয়েছে foo8bar foo9bar foo10bar foo11bar। এই বিস্তৃতি ফাইলের সাথে সম্পর্কিত নয়। একইভাবে, foo{eight,nine,ten,eleven}barপ্রসারিত হয় fooeightbar fooninebar footenbar fooelevenbar। এটি ksh / bash / zsh এ ব্রেস এক্সপেনশন।
— গিলস

6

তবে zsh স্পষ্টতই মনে করে আমি 2 থেকে 57 ফাইলের পরিবর্তে 2 থেকে 5 (বা এর মতো কিছু) ফাইলের জন্য জিজ্ঞাসা করছি Any কোন চিন্তা কেন?

কারণ []বন্ধনীগুলি ম্যাচ করা অক্ষরের একটি তালিকা (যা অঙ্ক হতে পারে) নির্দেশ করে, সংখ্যাগুলি গাণিতিকভাবে ব্যাখ্যা করা হয় না । এই ধরণের একক চরিত্রের সাথে মেলে against তালিকায় ব্যাপ্তি বা অক্ষর থাকতে পারে of [2-57]মিলটি "2 থেকে 5 এবং একটি 7 এর পরিসরের সমস্ত অঙ্কে" প্রসারিত হয় ।

2 থেকে 57 পর্যন্ত সংখ্যার সাথে মেলে, গ্লোবিং প্যাটার্নের পরিবর্তে (বা এর সাথে একসাথে) সিকোয়েন্স এক্সপ্রেশনটি ব্যবহার করা আরও সহজ হবে :

for x in /foo/bar/*{2..57}; do print $x; done

সম্পাদনা করুন : তবে এটি, দুর্ভাগ্যক্রমে, আপনাকে সমস্ত তালিকাভুক্ত ফাইলের অভিধান সংক্রান্ত ক্রম দেবে না - শেল বিস্তারের কারণে এগুলি সাধারণ সংখ্যার সমাপ্তি দ্বারা শ্রেণিবদ্ধ করা হবে।


ধন্যবাদ @ জর্জিট্রেজেভিয়াক্স! আমার এটা সম্পর্কে চিন্তা করা উচিত ছিল। আমার ফাইলগুলিতে সেগুলির সংখ্যা ছিল, তাই এক মুহুর্তের জন্য আমি ভেবেছিলাম যে []জিনিসগুলি
— যথাযথভাবে

আপনার ব্যাখ্যাটি [2-57]সঠিক, তবে আমি মনে করি না {2..57}(এটাই আপনি বোঝাতে চেয়েছিলেন, তাই না?) ইন্টিপিসি যা করতে চায় তার সাথে প্রাসঙ্গিক, যা "2 থেকে 57 ফাইলকে অভিধানিক ক্রমে চয়ন করুন"।
— গিলস 'অশুভ হওয়া বন্ধ করুন'

সম্পাদনার জন্য ধন্যবাদ (ঘুমানোর সময়, আমার ধারণা)। এবং আপনি ঠিক বলেছেন - আমি অভিধানের অর্ডার অংশটি ভুলে গিয়েছিলাম ।
— রোজিট্রিজেভিয়াচজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.