আপনি কখন বন্ধনী সম্প্রসারণ ব্যবহার করবেন?


49

আমি ব্রেস প্রসারণ কী তা বুঝতে পারি, তবে এটি কীভাবে সেরা ব্যবহার করা যায় তা আমি জানি না।

আপনি কখন এটি ব্যবহার করবেন?
আপনার নিজের টিপস থাকলে দয়া করে আমাকে কিছু সুবিধাজনক এবং উল্লেখযোগ্য উদাহরণ শিখিয়ে দিন।

উত্তর:


52

আপনার দীর্ঘ পথের নাম থাকলে বন্ধনী সম্প্রসারণ খুব কার্যকর। আমি একটি ফাইল ব্যাকআপ করার দ্রুত উপায় হিসাবে এটি ব্যবহার করি :

cp /a/really/long/path/to/some/file.txt{,.bak}

অনুলিপি /a/really/long/path/to/some/file.txtকরা হবে/a/really/long/path/to/some/file.txt.bak

আপনি এটি একটি ক্রম ব্যবহার করতে পারেন । ওয়েব থেকে প্রচুর পৃষ্ঠা ডাউনলোড করার জন্য আমি একবার এটি করেছি:

wget http://domain.com/book/page{1..5}.html

অথবা

for i in {1..100}
do
   #do something 100 times
done

8
এটি পাশাপাশি যুক্তির সদৃশতার জন্যও ব্যবহার করা যেতে পারে। বলুন আপনার কাছে এমন কিছু প্রোগ্রাম রয়েছে যা প্রতিটি ফাইল অপারেট করার জন্য একটি '-f' যুক্তি প্রয়োজন। না করার পরিবর্তে program -f file1 -f file2 -f file3, আপনি করতে পারেনprogram "-f file"{1..3}
প্যাট্রিক

এটা লজ্জাজনক। আমি কেবল এটি আবিষ্কার করেছি কিন্তু বছরের পর বছর ধরে রিস না জেনে অতিরিক্ত দীর্ঘ পথে ব্যাকআপ জিনিসটি করি। ধন্যবাদ।
smonff

2
@Patrick: এটা এ কারণে যে ব্যর্থ program: তিনটি শব্দের পায় "-f file1" "-f file2" "-f file3", 6 পরিবর্তে: "-f" "file1" "-f" "file2" "-f" "file3"
মুসফিল

@ ডগবেন: একটি forলুপে ব্যবহারের জন্য সম্প্রসারণ ব্যবহার করা কিছুটা অর্থহীন, যেহেতু আপনি লিখতে পারেন for ((i=1; i<=100; i++))এবং এটি আরও দক্ষ।
মুসফিল

30

বৃহত ডিরেক্টরি স্ট্রাকচারগুলি তৈরি করার সময় ব্রেস সম্প্রসারণ খুব কার্যকর হয়:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}

এটি আপনাকে দেবে

find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2

এমনকি আপনি আরও এক ধাপ এগিয়ে গিয়ে ব্রেস সম্প্রসারণে ব্রেস প্রসারিত করতে পারেন:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}

এটি আপনাকে উপরের উদাহরণের মতো একই ডিরেক্টরি কাঠামো দেবে।


3
বাসা বাঁধাই দুর্দান্ত, তবে আপনার বাসা উদাহরণ ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) আসলে কোনও উদ্দেশ্য করে না। আপনি শুধুমাত্র এই কাজ করতে পারে: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}
আইকনোক্লাস্ট

@ আইকনোক্লাস্ট, যদি আপনি ব্যাখ্যা করেন subdir1এবং subdir2অ-আক্ষরিক অর্থে এটি একটি উদ্দেশ্য হিসাবে কাজ করে । প্রতিস্থাপন subdir1সঙ্গে catএবং subdir2সঙ্গে dogউদাহরণস্বরূপ।
এফস্মিথ

2
@ আফস্মিথ: আপনি যদি "সাবডিআর 1" এবং "কুকুর" এর জন্য "সাবডির 2" এর অবস্থান হিসাবে ব্যাখ্যা করেন তবে নীড়ের উদাহরণ ব্যর্থ হয়, যেহেতু এটি সাবডির ব্যবহার করে {1,2}, এবং কোনও স্ট্রিং নেই যা আপনি প্রতিস্থাপন করতে পারবেন এর সাথে "সাবডির" সাবডিরকে {1,2} রিটার্ন {বিড়াল, কুকুর make তৈরি করবে}
আইকনোক্লাস্ট

21

আমি টাইপিং হ্রাস করতে চাইলে এটি ব্যবহার করি:

geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}

আরেকটি উদাহরণ:

wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev

12

আমি এটি ব্যবহারের সময় বিকাশের সময় টেস্ট আউটপুটটিকে কাঙ্ক্ষিত টেস্ট আউটপুটটির সাথে তুলনা করতে ব্যবহার করি। যদি পরীক্ষা # 41 ব্যর্থ হয় তবে সহজেই পরীক্ষা আউটপুট (ফাইল টেস্টে আউটপুট / 041) এবং কাঙ্ক্ষিত আউটপুট (ফাইল টেস্টে আউট / 041 তে) এর মধ্যে পার্থক্যটি দেখতে পারা সহজ:

$ diff tests.{out,output}/041

10

আমার জন্য কিছু ঘন ঘন কেস হ'ল:

নতুন নামকরণের জন্য:

mv myText.{txt,tex}

অথবা

mv myText.tex{,.old}

অথবা

cp myText.tex{,.backup}

(যদিও এটি সর্বশেষ 2 টি কাজের জন্য সংস্করণ নিয়ন্ত্রণ ব্যবহার করা কম অগোছালো))

তুলনা করার জন্য (ইতিমধ্যে উল্লিখিত):

diff path{1,2}/a.txt

3

এখানে বেশ কয়েকটি দুর্দান্ত উত্তর রয়েছে তবে ব্রেস প্রসারণ কখন ব্যবহার করবেন না সেগুলির মধ্যে কেউই উল্লেখ করেন না । অন্যান্য উত্তরদাতাদের মতো, আমি কমান্ড লাইনেও বেশ কিছুটা ব্যবহার করি expansion আমি স্মার্ট শেলটি আশা করতে পারি বলে আমি এটি আমার এলিয়াস এবং ফাংশনগুলিতেও ব্যবহার করি।

আমি না আমার শেল স্ক্রিপ্ট-এ এটি ব্যবহার (যদি না সেখানে অন্য কোন কারণে স্ক্রিপ্ট ব্যাশ বা zsh হওয়া উচিত যে, যদিও সেই ক্ষেত্রে, এটা ভাল মত একটি "বাস্তব" স্ক্রিপ্টিং ভাষা আপগ্রেড করার perlবা python)। ব্রেস এক্সপেনশন পোর্টেবল নয় কারণ এটি পসিক্স শেল স্ট্যান্ডার্ডে নেই। এমনকি যদি এটি আপনার /bin/sh- শেবাং এড শেল স্ক্রিপ্টগুলিতে কাজ করে তবে এটি বেশি স্ট্রিপড /bin/shশেল (উদাঃ dash) সহ সিস্টেমে কাজ করবে না ।

একক অঙ্কের পার্থক্যের ক্ষেত্রে আপনার ব্রেস সম্প্রসারণের প্রয়োজন হবে না; একটি চরিত্র শ্রেণি যথেষ্ট হবে:

Bashism:

diff file{1,2}

সুবহ:

diff file[12]

3
একটি পার্থক্য হ'ল file{1,2}সর্বদা প্রসারিত হবে file1 file2, যখন file[12]কেবল বিদ্যমান ফাইলের নামগুলিতে প্রসারিত হবে : অর্থাত্ file1উপস্থিত থাকলেও file2তা না থাকলে কেবলমাত্র file[12]প্রসারিত হয় file1[]সম্প্রসারণ সত্যিই একটি সীমিত সংস্করণ ?সম্প্রসারণ (এবং তাদের "পথনাম প্রসারণও" বলা হয়)।
মুসফিল

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