Multidigit dosya dizileri zsh cinsinden sözlük sırasına göre sıralanır.


24

Globbing ile zsh olarak iki tamsayı (örneğin 2 ila 57) içeren bir dizi dosya (sözlük sırasına göre) belirtmek istiyorum.

Örneğin: "2 ila 57 numaralı dosyaları, bazı genelleme desenleriyle eşleşen yolun altındaki sözlük sırasına göre seçin".

Köşeli parantez kullanarak yapabileceğini düşündüm

 for x in /foo/bar/*[2-57]; do print $x; done

Fakat zsh, dosyaları 2almak 5yerine dosyaları (veya buna benzer bir şey) 2istediğimi düşünüyor 57. Herhangi bir düşüncen neden? Bunu nasıl başarabilirim?

Yanıtlar:


30

[2-57]oluşan bir karakter kümesidir 2, 3, 4, 5ve 7, zsh ve diğer her joker ve regexp'in sözdiziminde orada. Glob şablonunuz *[2-57], son karakteri bu beş haneden biri olan her dosya adıyla eşleşir.

Bence dünya [m,n] elemelerinin sözdizimini yanlış anlıyorsun . Glob niteleyicileri her zaman desenin sonunda parantez içinde bulunur ve aralık ayırıcı virgül olur. Desen *([2,57]), 2., 3.,…, 57. eşleşmelere genişler. Varsayılan genişleme sırası sözlükbilimseldir ( numeric_glob_sortseçenek ayarlanmışsa sayıları sayısal sırada sıralamak için bazı özel büyülerle ); oveya Oglob niteleyici ile kontrol edebilirsiniz (örneğin *(om[2,57]), en son bir dosya dışında en son 57 dosyayı eşleştirmek için).

for x in /foo/bar/*([2,57]); do print $x; done

İstediğiniz şey değil, ama ilgili ve gelecekteki okuyucular için muhtemelen yararlı olabilir: 2'den 57'ye kadar olan dosyaları numaralandırmak istiyorsanız, varsa veya olmasın, bir aralık ayracı ifadesi kullanabilirsiniz . Bu özellik bash ve ksh da mevcuttur.

echo hello{2..57}

Ayrıca adı 2 ile 57 arasında bir sayı içeren dosyalarla eşleştirmek istiyorsanız, deseni kullanabilirsiniz <2-57>. Bu, zsh'ye özgüdür.

$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57

Bunun gibi bir kalitenin *<2-57>beklediğiniz şeyi yapmayacağına dikkat edin, çünkü *rakam da aynı olabilir. Örneğin, file58maçları *<2-57>ile file5eşleşen *kısmı ve 8eşleştirme <2-57>kısmı. Desen *[^0-9]<2-57>bu sorunu önler.


Haklısın. Glob elemesini yanlış anlıyordum. Dikkatli açıklama için teşekkürler.
Amelio Vazquez-Reina

Bu arada, bu açıklama bana karıştı var biraz: if you want to enumerate files 2 to 57 whether they exist or not, you can use a range brace expression. Eğer dosyalar mevcut değilse ve eşleşme yoksa, küme genişletme nasıl genişletileceğini nasıl bilebilir? (glob niteleyicisinden farklı olarak nasıl genişleyecekti?)
Amelio Vazquez-Reina

2
@ INTRPC için foo{8..11}bargenişler foo8bar foo9bar foo10bar foo11bar. Bu genişleme biti dosya isimleriyle ilgisizdir. Benzer şekilde, foo{eight,nine,ten,eleven}bargenişler fooeightbar fooninebar footenbar fooelevenbar. Bu, ksh / bash / zsh içindeki küme genişletmedir .
Gilles 'SO- kötülük'

6

ama zsh, görünüşe göre 2 - 57 arası dosyalar yerine 2 - 5 arası dosyaları (veya buna benzer bir şey) istediğimi düşünüyor.

Çünkü []parantez eşleşti bir listesini gösterir karakterler (basamak olabilir) değil, sayılar matematiksel olarak yorumlanır. Bu desen tek bir karakterle eşleştirilir . Liste aralıkları içerebilir, ancak rakam veya harflerden oluşabilir. [2-57]eşleşme "2 ile 5 ve 7 arasındaki tüm sayılar" ile genişler .

2'den 57'ye kadar olan sayıları eşleştirmek için, genel bir kalıp yerine bir dizilim ifadesi kullanmak daha kolay olacaktır (ya da bununla birlikte):

for x in /foo/bar/*{2..57}; do print $x; done

Düzenleme : Ancak bu, maalesef, listelenen tüm dosyaların sözlükbilimsel sırasını vermeyecektir - kabuk genişlemesi nedeniyle genel sayı sonlarına göre gruplandırılırlar.


@Rozcietrzewiacz teşekkürler! Bunu düşünmeliydim. Dosyalarımın içinde sayılar vardı, bu yüzden bir an için []işleri sırayla yazdırıyordum ..
Amelio Vazquez-Reina

Açıklamanız [2-57]doğru, ancak bence {2..57}ne demek istediğin bu değil mi? Intrpc'in yapmak istediği şeyle alakalı değil, “2-5 sıradaki dosyaları seçin”.
Gilles 'SO- kötülük' dur

Düzenleme için teşekkürler (uyku zamanı, sanırım). Ve haklısın - sözlük düzeni düzenini unuttum .
rozcietrzewiacz
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.