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.