শেল ওয়াইল্ডকার্ডগুলিতে OR প্যাটার্ন ব্যবহার করা


52

আমার দির বিষয়বস্তু হয়

$ ls -lrt
total 0
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 noon.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

আমি নির্দিষ্ট হিসাবে ফাইলের মধ্যে একটি শব্দ আছে এমন ফাইলগুলির বিশদটি তালিকাবদ্ধ করতে চাই।

উদাহরণ:

$ ls -lrt *day|night*
ls: *day: No such file or directory
bash: night.txt: command not found

প্রত্যাশিত আউটপুট

-rw-r--r-- 1 user1 admin 19 Oct  8 12:31 night.txt
-rw-r--r-- 1 user1 admin 38 Oct  8 12:31 day.txt

2 টি পৃথক অংশের সাথে মিলে থাকা বিভিন্ন ফাইল কীভাবে তালিকাভুক্ত করা যায় বা সংক্ষেপে কীভাবে রিজেেক্স ব্যবহার করতে হয় ls, যাতে আমি ORফাইলের নামগুলির অংশগুলি পারতাম ।

আসল পরিস্থিতি, ডিরেক্টরিতে অনেকগুলি ফাইল রয়েছে, জিজ্ঞাসার জন্য কেসটি ছোট করেছেন।

উত্তর:


65

আপনি যা চান তা করতে আপনার বাড়ানো গ্লোববিং সক্রিয় করার প্রয়োজনও নেই। এটি ব্যাশে কাজ করবে:

ls {day*,night*}

7
না এটি হয় না: touch day.txt; touch night.txt; ls {*day,night*}ফলাফলls: *day: No such file or directory
মাত্তেও

1
আমি মূল পোস্টারের পাঠ্যটি খাপ খাইয়ে নিচ্ছিলাম; আমি ভেবেছিলাম এটা পরিষ্কার ছিল। দীর্ঘশ্বাস । পাঠ্য আপডেট হয়েছে। অবশ্যই আপনি দেখতে পারেন যে প্রক্রিয়াটি কাজ করে?
ব্রুস

7
অথবা সম্ভবত *{day,night}*ওপি যা চায় তার কাছাকাছি।
ডারোবার্ট

25

lsফাইলনামে ফিল্টার করার কোনও বিকল্প নেই তবে বেশিরভাগ শেলগুলিতে গ্লোববিং এক্সটেনশন রয়েছেman bash /Pattern Matching

ksh

ls -lrtd -- *@(day|night)*

zsh

setopt extendedglob
ls -lrtd -- *(day|night)*

বা:

setopt kshglob
ls -lrtd -- *@(day|night)*

সজোরে আঘাত

shopt -s extglob
ls -lrtd -- *@(day|night)*

এই তিনটি শেলের যে কোনওটিতে আপনি এটি করতে পারেন তবে নোট করুন যে কোনও একটি ক্ষেত্রে যদি কোনও ফাইলের সাথে মেলে না, তবে সেই প্যাটার্নটি অপরিবর্তিত রেখে দেওয়া হবে (উদাহরণস্বরূপ *day* night1.txt othernight.txtযদি কোনও ফাইলের নাম নেই day; দেখুন man bash /EXPANSIONবা /Brace Expansionনির্দিষ্টভাবে দেখুন):

ls -lrtd -- *{day,night}*

যে কোনও শেল এ আপনি করতে পারেন:

ls -lrtd -- *day* *night*

Zsh এ, যদি ফাইল dayবা nightফাইল না থাকে তবে শেষ দুটি কমান্ড ব্যর্থ হবে; বিকল্প nonomatchবা সেট করুন csh_null_glob, বা (N)এড়াতে প্রতিটি প্যাটার্নের পরে যুক্ত করুন ।


1
কি সম্পর্কে *{day,night}*। আমি এটি সম্পাদনা করব, তবে কোন শাঁস এটি সমর্থন করে তা আমি জানি না?
র্যান্ডম 832

@ র্যান্ডম 832 কাজ করে bash, kshএবং zsh(কারওরও কাছে বাড়ানো গ্লোব্বিংয়ের প্রয়োজন নেই) তবে তা নয় sh- তবে নাহুয়ালের শেষ "সমস্ত শেল" উদাহরণটি কাজ করে sh
ইজকাটা

14

শেলগুলি যুক্তি প্রসারণের জন্য নিয়মিত অভিব্যক্তি ব্যবহার করে না।

আপনি এর দ্বারা বর্ধিত প্যাটার্নটি মিলিয়ে সক্ষম করতে পারেন

$ shopt -s extglob

এবং তারপর

$ ls @(day|night).txt
day.txt   night.txt

উদাহরণস্বরূপ বাশ রেফারেন্স ম্যানুয়াল (প্যাটার্ন ম্যাচিং) দেখুন

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