ফাইলের নামগুলিতে শেল এক্সপেনশন (এ | বি)?


9

orউদাহরণস্বরূপ কোনও ফাইল পড়ার সময় শেলের মধ্যে কোনও পছন্দ প্রসারিত করা কি সম্ভব ?

আমি এর দ্বারা যা বোঝাচ্ছি তা হ'ল উদাহরণস্বরূপ grepসিন্টেক্সকে (A|B)কোনও ফাইলে A বা B এর সাথে মেলে supports

একইভাবে, যদি আমার কাছে এই ফাইলগুলি থাকে:

file1.txt
file2.txt
file3.txt
file4.txt
file5.txt

আমি কাজ করতে পারে cat file{1..5}.txtমধ্যে bash, যেমন পরিসীমা বিস্তৃতি ঘটে। কেবলমাত্র দু'একটি ফাইলের জন্য এটি করার সমতুল উপায় আছে?

উদাহরণস্বরূপ cat file(1|5).txtএবং শুধুমাত্র যারা 2 মুদ্রণ?

উত্তর:


16

মান ফাইলের নাম globbing প্যাটার্ন মেলে একটি অঙ্ক হয় [0-9]। এটি একক অঙ্কের সাথে মেলে:

cat file[0-9].txt

এর মধ্যে দুটি মাত্র নির্বাচন করতে:

cat file[25].txt

9 এর চেয়ে বড় সংখ্যার জন্য, ব্রেস সম্প্রসারণ দরকারী হবে (তবে গ্লোব্বিং নিদর্শন এবং ব্রেস বিস্তারের মধ্যে পার্থক্যের জন্য নীচের নোটটি দেখুন):

cat file{25..60}.txt

আবার, ব্রেস সম্প্রসারণ পৃথক সংখ্যার জন্যও অনুমতি দেয়:

cat file{12,45,900,xyz}.txt

(মনে রাখবেন যে উপরের উদাহরণে, ব্রেস সম্প্রসারণে একটি গাণিতিক লুপ জড়িত না, কেবল প্রদত্ত স্ট্রিংয়ের উপর ভিত্তি করে নাম উত্পন্ন করে)।

ইন bash, সঙ্গে extglobশেল বিকল্পটি সক্ষম ( shopt -s extglob), নিম্নলিখিত এছাড়াও কাজ:

cat file@(12|45|490|foo).txt

@(...)প্যাটার্ন অন্তর্ভুক্ত যে কোনো একটি ম্যাচ হবে |-delimited নিদর্শন।


যেমন globbing নিদর্শন মধ্যে পার্থক্য [...]এবং @(...)এবং বক্রবন্ধনী প্রসারণও, যে একটি বক্রবন্ধনী সম্প্রসারণ করা হয় কমান্ড লাইন এ উৎপন্ন এবং আসলে বর্তমান ডিরেক্টরির মধ্যে যেকোনো বিদ্যমান নাম মিলতে পারে। একটি ফাইলের নাম গ্লোব্বিং প্যাটার্ন নামের সাথে মেলে তবে সমস্ত সম্ভাব্য নাম না থাকলে শেলটি অভিযোগ করবে না। যদি কোনও মিলে যাওয়া নাম বিদ্যমান না থাকে তবে nullglobশেল বিকল্পটি সেট না করা থাকলে প্যাটার্নটি অপরিবর্তিত থাকবে will

উদাহরণ:

touch file1

ls file[0-9]

এখানে কেবলমাত্র ফাইলের জন্য তালিকা প্রদর্শন করা file1হবে।

সঙ্গে ls file{0..9}, lsনা নালিশ জানাব খোঁজার file0, file2ইত্যাদি

নিম্নলিখিত উদাহরণে, প্রথম কমান্ড কেবলমাত্র বিদ্যমান নামগুলিকে স্পর্শ করবে যা প্রদত্ত প্যাটার্নটির সাথে মেলে, যখন দ্বিতীয় লাইনটি এমন ফাইল তৈরি করবে যা ইতিমধ্যে বিদ্যমান নেই:

touch file[0-9]

touch file{0..9}

@thecarpy আমি দুঃখিত, কিন্তু যে একটি প্যাটার্ন মেলে হবে যেমন নয় file45.txt। বন্ধনী এক্সপ্রেশনটি [...]নিয়মিত প্রকাশের মতোই কাজ করে তবে "না" হিসাবে বলার !জন্য ^ব্যবহার করে। একটি [...]প্যাটার্ন সর্বদা একটি একক অক্ষরের সাথে মেলে।
কুসালানন্দ

তুমি ঠিক! বিটিডাব্লু, আমারও {1,2}পসিক্স কমপ্লায়েন্ট নয় ... আজ কয়েকটি নতুন জিনিস শিখেছি!
thecarpy

2
সত্যিকারের ফাইলগুলির সাথে ব্রেস সম্প্রসারণের প্রয়োজন নেই এটি অত্যন্ত কার্যকর হতে পারে, যদি আপনি এটি ব্যবহার করতে (উদাহরণস্বরূপ) প্যাটার্নগুলি উত্পন্ন করার জন্য ব্যবহার করেন grep, ইউআরএলগুলি পাস করার জন্য curlএবং এই জাতীয় কিছু ... তবে এটি বিভ্রান্তিকর হতে পারে গ্লোবগুলির সাথে কাজ করার অভ্যস্ত লোকদের কাছে।
কেভিন

@ কেভিন সঠিক একটি বন্ধনী সম্প্রসারণ ফাইলের নাম সম্পর্কে প্রয়োজন হবে না।
কুসালানন্দ

7

ব্যবহারের সিনট্যাক্সটি file{1,2}যা মূল্যায়ন করবে file1এবং তা file2

$ ls
$ touch file{1,2,3,4,5,6,7,8,9}
$ ls
file1  file2  file3  file4  file5  file6  file7  file8  file9

ইনিয়ান যেমন নীচের দিকেও উল্লেখ করেছেন ... touch file{1..9}উদাহরণস্বরূপ এটি করা সহজ হবে ...

$ ls
$ touch file{1..9}
$ ls
file1  file2  file3  file4  file5  file6  file7  file8  file9

আপনি একাধিক এক্সপ্রেশনও ব্যবহার করতে পারেন, যেমন:

$ ls
$ touch file{1..9}{a..z}
$ ls
file1a file1b file1c
[...]
file9x file9y file9z

হ্যাঁ, উপরেরগুলি 234 ( 9বার 26) ফাইল তৈরি করবে ।


1
এই file{1,2} বাক্য mv some_very_long_filename.txt{,.bak}
গঠনটি

6

হ্যাঁ আপনি bashশেলটিতে ব্রেস প্রসারণ ব্যবহার করতে পারেন । মাত্র দু'একটি ফাইলের জন্য file{1..2}ঠিক যেমন বা ঠিক তেমনfile{1,2}

বা যদি আপনি কিছু ক্ষেত্রে ফাইলগুলি না থাকার বিষয়ে উদ্বিগ্ন হন তবে একটি সাধারণ লুপ করুন,

for file in file{1..4}.txt; do
    [ -f "$file" ] || continue
    echo "$file" # Do other actions on file here
done

অথবা যদি কেবল কনটেন্টেটিং হ'ল ফাইলগুলিতে আপনার একমাত্র অপারেশন এবং আপনি যদি নিশ্চিত হন না যে কোন সময় কোন ফাইল উপস্থিত থাকতে পারে না, কেবল catসেগুলি এবং ত্রুটিগুলি দমন করে। /dev/nullযদি ফাইলটি উপলব্ধ না হয় তবে ত্রুটিগুলি দমন করতে স্ট্যান্ডার্ড ত্রুটিটিকে পুনরায় নির্দেশনা দেওয়া হচ্ছে।

cat file{1,5}.txt 2>/dev/null

বা গ্লোব এক্সপ্রেশন ব্যবহার করুন file[15]যা ফাইলটি খুঁজে পাওয়া না গেলে ত্রুটিগুলির বিষয়ে অভিযোগ করে না।

cat file[15].txt

2
নাহ, ফাইলগুলি না থাকার বিষয়ে কোনও উদ্বেগ নেই, আমি কেবল 2 সংখ্যা অনুসারে 2 টি ফাইলের বিষয়বস্তুটি দেখাতে চেয়েছিলাম, তবে এটি ধারাবাহিকভাবে নয়, তাই file{1,5}কমা সিনট্যাক্সটি আমি হারিয়ে যাচ্ছিলাম!
জো হিলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.