Brace genişlemesini ne zaman kullanıyorsunuz?


49

Ben ne olduğunu anlamak bağ genişleme , ama nasıl kullanılacağını iyi bilmiyorum.

Ne zaman kullanıyorsun?
Kendi ipucunuz varsa lütfen bana bazı uygun ve dikkat çekici örnekler verin.

Yanıtlar:


52

Uzun yol adlarınız varsa küme ayracı genişletme işlemi çok yararlıdır. Bir dosyayı yedeklemek için hızlı bir yol olarak kullanıyorum :

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

kopyalar /a/really/long/path/to/some/file.txtiçin/a/really/long/path/to/some/file.txt.bak

Ayrıca bir sırayla kullanabilirsiniz . Bir keresinde web’ten çok fazla sayfa indirmek için yaptım:

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

veya

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

8
Bu, argüman çoğaltması için de kullanılabilir. Diyelim ki her dosyanın çalışması için '-f' argümanı gerektiren bir programınız var. yapmak yerine, program -f file1 -f file2 -f file3yapabilirsinizprogram "-f file"{1..3}
Patrick

Bu utanç verici. Daha yeni keşfettim, ancak yedeklemeyi uzun yıllar süren yollarda bunu bilmeden yaptım. Teşekkürler.
smonff

2
@Patrick: Bu başarısız çünkü programüç kelime alır: "-f file1" "-f file2" "-f file3"6 yerine "-f" "file1" "-f" "file2" "-f" "file3".
musiphil

@dogbane: Bir fordöngüde kullanım için genişletmeyi kullanmak biraz anlamsızdır, çünkü yazabilirsiniz for ((i=1; i<=100; i++))ve daha verimlidir.
musiphil

30

Büyük dizin yapıları oluştururken ayraç genişletme çok kullanışlı olur:

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

Bu sana verecek

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

Hatta bir adım daha ileri gidip brace genişlemesini brace genişlemeye koyabilirsiniz:

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

Bu size yukarıdaki örnekle aynı dizin yapısını verecektir.


3
Yuvalama güzel, ancak yuvalama örneğiniz ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) aslında herhangi bir amaca hizmet etmiyor. Sadece bu yapmış olabilir: mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
iconoclast

@iconoclast, bu yorumlamak eğer bir amaca hizmet yapar subdir1ve subdir2olmayan gerçek anlamda. Değiştir subdir1ile catve subdir2ile dogörneğin.
ephsmith

2
@ephsmith: "subdir1" i "cat" ve "dog" için "subdir2" için durmuş olarak yorumlarsanız, yuvalama örneği başarısız olur, çünkü subdir {1,2} kullanır ve değiştirebileceğiniz bir dize yoktur. Bununla "subdir", {1,2} alt dizinini döndürür {return, cat}.
iconoclast

21

Yazmayı azaltmak istediğimde kullanırım:

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

Başka bir örnek:

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

12

Geliştirme sırasında gerçek test çıktısını istenen test çıktısıyla karşılaştırmak için kullanıyorum. Test # 41 başarısız olursa, test çıkışı (tests.output / 041 dosyasında) ve istenen çıktı (tests.out / 041 dosyasında) arasındaki farkın ne olduğunu görmek kolaydır:

$ diff tests.{out,output}/041

10

Benim için sık kullanılan bazı durumlar:

Yeniden adlandırmak için:

mv myText.{txt,tex}

veya

mv myText.tex{,.old}

veya

cp myText.tex{,.backup}

(Son 2 görev için sürüm denetimi kullanmak daha az karmaşık olmasına rağmen.)

Karşılaştırma için (daha önce bahsedilen):

diff path{1,2}/a.txt

3

Orada birkaç büyük cevaplar burada, ama ne zaman bunların hiçbiri söz değil ayracı genişlemesini kullanmak. Diğer cevaplayıcılar gibi ben de komut satırında ayraç genişlemesi kullanıyorum. Akıllı bir kabuk bekleyebileceğimden, takma ve fonksiyonlarımda da kullanıyorum.

Ben do not (bu durumlarda, bu gibi bir "gerçek" komut dosyası dili yükseltmek için en iyisi olsa da, komut bash veya zsh olmalıdır başka sebepler olmadıkça benim kabuk komut kullanmak perlveya python). Parantez genişlemesi POSIX kabuk standardında olmadığı için taşınabilir değildir. Sizin çalışır bile /bin/sh- shebang ed kabuk komut, daha elimden sistemlerde çalışmaz /bin/shkabukları (örn dash).

Tek basamaklı bir fark olması durumunda, ayraç genişlemesi gerekmez; bir karakter sınıfı yeterli olacaktır:

Bashism:

diff file{1,2}

Taşınabilir:

diff file[12]

3
Bir fark olduğunu file{1,2}her zaman genişleyecek file1 file2olurken, file[12]genişletir sadece mevcut dosya için: yani eğer file1mevcutsa ama file2olmuyorsa file[12]şekilde genişler file1sadece. []Genişleme gerçekten bir kısıtlı versiyonu ?genişleme (ve onlar "yol adı açılımları" denir).
musiphil

Doğru, ayraç genişletme kabuk topaklama değil (aka yol adı genişletme). Bu henüz söylenmemiş olan iyi bir çağrıdır: küme genişlemesi beklenmedik bir şekilde bulunmayan yollara dikkat çekmekte daha iyidir. Ayrıca, ayraç genişlemesinin içinde toplanabilir.
Adam Katz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.