[2-57]
являє собою набір символів , що складається з 2
, 3
, 4
, 5
і 7
, в Zsh і будь-який інший шаблону і синтаксисі регулярних виразів там. Ваш шаблон шаблону *[2-57]
відповідає кожному імені файлу, останній символ якого - одна з цих п'яти цифр.
Я думаю, ви неправильно запам'ятовуєте синтаксис глобального [m,n]
класифікатора . Кваліфікатори глобусу завжди містяться в дужках в кінці шаблону, а роздільник діапазону є комою. Шаблон *([2,57])
розширюється до 2-го, 3-го,…, 57-го збігів. Порядок розширення за замовчуванням є лексикографічним (з якоюсь особливою магією сортувати числа за порядковим числом, якщо numeric_glob_sort
параметр встановлений); ви можете керувати ним за допомогою o
або O
глобального класифікатора (наприклад, *(om[2,57])
щоб відповідати 57 найновішим файлам, крім одного самого останнього файлу).
for x in /foo/bar/*([2,57]); do print $x; done
Не те, про що ви просили, але пов’язане і, можливо, корисне майбутнім читачам: якщо ви хочете перерахувати файли від 2 до 57, існують вони чи ні, ви можете використовувати вираз діапазону дужок . Ця функція існує також у bash та ksh.
echo hello{2..57}
І якщо ви хочете відповідати файлам, ім'я яких містить число від 2 до 57, ви можете використовувати шаблон <2-57>
. Це специфічно для zsh.
$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57
Зауважте, що такий зразок *<2-57>
, ймовірно, не буде робити те, що ви очікуєте, тому що *
може відповідати цифрам. Наприклад, file58
сірники *<2-57>
, з file5
узгодженням *
частини та 8
узгодженням <2-57>
частини. Ця модель *[^0-9]<2-57>
уникає цього питання.