[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.