`Ls` এবং নিয়মিত প্রকাশের সাথে তালিকাবদ্ধ


15

শেষ অক্ষরের সাথে এবং .txtএক্সটেনশনের সাথে শেষ হওয়া কোনও ফাইলের নাম দিয়ে আমি কীভাবে ফাইলগুলি তালিকা করতে পারি ?

আমি চেষ্টা করেছি ls *+([[:digit:]]).txtকিন্তু এটি সত্য abc12.txtএবং সত্যই abc2.txt।

তবে আমার পাওয়া দরকার abc2.txt। আমি এটা কিভাবে করবো?

এটির কোনও ধরণের রূপ কি :digit:এটি করবে?


2
এটা লক্ষনীয় প্যাটার্ন একমাত্র বৈধ globbing বাড়ানো endabled: shopt -s extglob।
— donothingsuccessfully

উত্তর:


20

কেমন:

ls *[!0-9][0-9].txt

!গ্রুপ শুরুতে এর অর্থ সম্পূরক।

মন্তব্যে উল্লিখিত হিসাবে, এটি বাশ করছে, উদাহরণস্বরূপ চেষ্টা করুন:

printf "%s\n" *[!0-9][0-9].txt

3
নোট করুন যে বাশ (যেমন ls) এখানে নিয়মিত এক্সপ্রেশন সমর্থন করে না। এগুলি ফাইলের নাম এক্সপ্রেশন (গ্লোব্বিং) । আপনি ইতিমধ্যে আপনার উদাহরণে পার্থক্যটি দেখতে পাচ্ছেন: এখানে, *একটি ওয়াইল্ডকার্ড, যা নিয়মিত প্রকাশে নেই, যেখানে আপনি এটি .*অর্জন করতে ব্যবহার করবেন। নিয়মিত প্রকাশগুলি গ্লোব্বিংয়ের চেয়ে অনেক বেশি শক্তিশালী।
— ক্রিস্টোফার কে।

2

প্রশ্নটি নিয়মিত প্রকাশের জন্য জিজ্ঞাসা করেছিল। বাশ, এবং এইভাবে ls, এখানে নিয়মিত অভিব্যক্তি সমর্থন করে না। এটি যা সমর্থন করে তা হ'ল ফাইলের নাম এক্সপ্রেশন ( গ্লোব্বিং ), ওয়াইল্ডকার্ডের একধরনের । নিয়মিত প্রকাশগুলি এর চেয়ে অনেক বেশি শক্তিশালী।

আপনি যদি সত্যিই নিয়মিত এক্সপ্রেশন ব্যবহার করতে চান তবে আপনি এটি ব্যবহার করতে পারেন find -regex:

find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'

অনুসন্ধান ডিফল্ট অনুসারে পুনরাবৃত্ত হয়, তবে lsতা নয়। কেবলমাত্র বর্তমান ডিরেক্টরিতে ফাইলগুলি সন্ধান করতে আপনি এর সাথে পুনরাবৃত্তি অক্ষম করতে পারেন -maxdepth 1। পথের সাথে ফাইল নামের বিরুদ্ধে ম্যাচগুলি সন্ধান করুন, এজন্য ./আপনি যদি সন্ধান করেন তবে ফাইল নামগুলি শুরু হয় .। রেজেক্স এটির সাথে লড়াই শুরু \./করে। মনে রাখবেন যে একটি রেইজেক্সে, .কোনও চরিত্রের সাথে মেলে একটি বিশেষ চরিত্র, তবে এখানে আমরা সত্যিই একটি বিন্দু চাই, সে কারণেই আমরা এটি ব্যাকস্ল্যাশ দিয়ে এড়িয়ে চলেছি। আমরা ডট .txtইনগুলির জন্যও একই কাজ করি কারণ রেইজেক্স অন্যথায় মিলে যায় Atxt। অঙ্কের ক্লাসগুলি গ্লোব্বিংয়ের মতো, কেবলমাত্র অক্ষর শ্রেণিটি উল্টানোর ^পরিবর্তে আপনার প্রয়োজন !।

আপনি যদি আউটপুট পেতে চান lsতবে আপনি এটির -exec lsমতো ব্যবহার করতে পারেন :

 find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;

findবিভিন্ন regex স্বাদ একজোড়া সমর্থন করে। আপনি একটি নির্দিষ্ট করতে পারেন -regextype, উদাহরণস্বরূপ:

find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'

আমার জন্য, সম্ভাব্য প্রকারগুলি হ'ল: 'ফাইন্ডুইল্টস-ডিফল্ট', 'অ্যাজক', 'এগ্রিপ', 'এডি', 'ইম্যাকস', 'গ্নু-অজক', 'গ্রেপ', 'পিক্সিক-অ্যাজক', 'পিক্সিক-বেসিক' , 'পিক্সিক্স-এগ্রিপ', 'পিক্সিক্স-এক্সটেন্ডেড', 'পিক্সিক্স-মিনিমাম-বেসিক', 'সেড' আপনি find -regextype helpআপনার সিস্টেমে কী সমর্থিত তা জানতে রান করতে পারেন ।


0

সঙ্গে ksh বাড়ানো globs (অথবা bash -O extglobবা zsh -o kshglob) যে আপনি ইতিমধ্যে ব্যবহার করছেন, যে হতে হবে:

ls -d -- ?(*[![:digit:]])[[:digit:]].txt

অথবা

ls -d -- !(*[[:digit:]])[[:digit:]].txt

আপনার উপর মেলে চান a1.txt এবং2.txt না কিন্তু a12.txtনা 12.txt।

তবে খেয়াল করুন যে ksh এবং bash এ (আপনি যদি failglobzsh এর মতো আচরণ করার অপশনটি সেট না করেন ), যদি সেই প্যাটার্নটি কোনও ফাইলের সাথে মেলে না, তবে প্যাটার্নটি আক্ষরিক অর্থে চলে যাবে lsএবং যদি (আশ্চর্যরূপে নামকরণ করা) ফাইলটি ঘটে থাকে বিদ্যমান, এটি সূচিত হবে lsযদিও এটি প্যাটার্নের সাথে নিজেও মেলে না।

অন্তর্ভুক্ত করার জন্য .2.txt, সেট dotglobবিকল্প bash, অ্যাড (D)মধ্যে উল্লিখিত glob কোয়ালিফায়ার zsh, অথবা সেট FIGNOREকরার !(.|..)মধ্যে ksh93।

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