[2-57]
Jest to zestaw znaków składający się z 2
, 3
, 4
, 5
i 7
, w zsh i każdego innego zamiennika i składni regexp tam. Twój wzorzec globu *[2-57]
pasuje do każdej nazwy pliku, którego ostatnim znakiem jest jedna z tych pięciu cyfr.
Myślę, że źle pamiętasz składnię [m,n]
kwalifikatora glob . Kwalifikatory glob zawsze znajdują się w nawiasach na końcu wzorca, a separatorem zakresu jest przecinek. Wzór *([2,57])
rozwija się do 2., 3.,…, 57. dopasowania. Domyślna kolejność rozwijania jest leksykograficzna (z pewną specjalną magią do sortowania liczb w kolejności numerycznej, jeśli numeric_glob_sort
opcja jest ustawiona); możesz kontrolować to za pomocą kwalifikatora o
lub O
glob (np. *(om[2,57])
aby dopasować 57 najnowszy plik oprócz jednego najnowszego pliku).
for x in /foo/bar/*([2,57]); do print $x; done
Nie to, o co prosiłeś, ale powiązane i być może przydatne dla przyszłych czytelników: jeśli chcesz wyliczyć pliki od 2 do 57, czy istnieją, czy nie, możesz użyć wyrażenia nawiasowego zakresu . Ta funkcja istnieje również w bash i ksh.
echo hello{2..57}
A jeśli chcesz dopasować pliki, których nazwa zawiera liczbę od 2 do 57, możesz użyć wzorca <2-57>
. Jest to specyficzne dla Zsh.
$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57
Pamiętaj, że podobny wzór *<2-57>
prawdopodobnie nie spełni oczekiwań, ponieważ *
może również pasować do cyfr. Na przykład file58
dopasowania *<2-57>
, z file5
dopasowaniem *
części i 8
dopasowaniem <2-57>
części. Wzór *[^0-9]<2-57>
pozwala uniknąć tego problemu.
if you want to enumerate files 2 to 57 whether they exist or not, you can use a range brace expression
. Jeśli pliki nie istnieją i nie ma żadnych dopasowań, w jaki sposób rozszerzenie nawiasów wiedziałoby, jak rozwinąć? (w jaki sposób miałby się rozszerzyć inaczej niż kwalifikator globalny?)foo{8..11}bar
rozwija się dofoo8bar foo9bar foo10bar foo11bar
. Ten fragment rozszerzenia nie jest związany z nazwami plików. Podobniefoo{eight,nine,ten,eleven}bar
rozwija się dofooeightbar fooninebar footenbar fooelevenbar
. Jest to rozszerzenie nawiasu klamrowego w ksh / bash / zsh.Ponieważ
[]
nawiasy oznaczają listę pasujących znaków (które mogą być cyframi), a nie liczby interpretowane matematycznie. Taki wzór jest dopasowywany do jednego znaku. Lista może zawierać zakresy, ale cyfr lub liter.[2-57]
dopasowanie rozwija się do „Wszystkie cyfry z zakresu od 2 do 5 i 7” .Aby dopasować liczby od 2 do 57, łatwiej byłoby użyć wyrażenia sekwencji zamiast wzorca globowania (lub łącznie z takim):
Edycja : Ale to niestety nie da ci uporządkowania leksykograficznego wszystkich wymienionych plików - zostaną one pogrupowane według wspólnych numerów kończących się z powodu rozszerzenia powłoki.
źródło
[]
drukuję rzeczy w porządku ...[2-57]
jest poprawne, ale nie sądzę{2..57}
(to miałeś na myśli, prawda?) Jest istotne dla tego, co intrpc chce zrobić, czyli „wybierz pliki od 2 do 57 w porządku leksykograficznym”.