आप ब्रेस विस्तार का उपयोग कब करते हैं?


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}
पैट्रिक

यह शर्म की बात है। मैंने अभी इसे खोजा है, लेकिन बिना जान-पहचान के वर्षों तक अतिरिक्त-लंबे रास्तों पर बैकअप का काम करें। धन्यवाद।
सूना

2
@ पैट्रिक: वह विफल हो 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
@ephsmith: यदि आप "कुत्ते" के लिए "बिल्ली" और "उपडिर 2" के रूप में "सबडिर 1" की व्याख्या करते हैं, तो घोंसला उदाहरण विफल हो जाता है, क्योंकि यह उपडेयर {1,2} का उपयोग करता है, और कोई स्ट्रिंग नहीं है जिसे आप बदल सकते हैं "सबडिर" उसी के साथ उपडिर {1,2} रिटर्न {कैट, डॉग} बना देगा।
आइकनोकॉस्ट

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) और वांछित आउटपुट के बीच अंतर क्या है (फ़ाइल test.out / 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

यहाँ कई शानदार उत्तर हैं, लेकिन ब्रेस विस्तार का उपयोग नहीं करने के लिए उनमें से कोई भी उल्लेख नहीं करता है। अन्य उत्तरदाताओं की तरह, मैं कमांड लाइन पर ब्रेस विस्तार का काफी उपयोग करता हूं। मैं अपने उपनामों और कार्यों में भी इसका उपयोग करता हूं क्योंकि मैं एक स्मार्ट शेल की उम्मीद कर सकता हूं।

मैं अपनी शेल स्क्रिप्ट में इसका उपयोग नहीं करता हूं (जब तक कि कुछ अन्य कारणों से स्क्रिप्ट को बैश या zsh नहीं होना चाहिए, हालांकि उन मामलों में, यह "वास्तविक" स्क्रिप्टिंग भाषा जैसे perlया के लिए अपग्रेड करना सबसे अच्छा है python)। ब्रेस का विस्तार पोर्टेबल नहीं है क्योंकि यह POSIX शेल मानक में नहीं है। यहां तक कि अगर यह अपने में काम करता है /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[]?
मुशीफिल

सही, ब्रेस विस्तार शेल ग्लोबिंग (उर्फ पाथनेम विस्तार) नहीं है। यह एक अच्छा कॉल-आउट है जिसका वास्तव में अभी तक उल्लेख नहीं किया गया है: अप्रत्याशित रूप से अनुपस्थित पथों पर ध्यान देना बेहतर है। आप ब्रेस विस्तार के अंदर ग्लोब भी कर सकते हैं।
एडम काट्ज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.