[2-57]представляет собой набор символов , состоящий из 2, 3, 4, 5и 7, в Zsh и любой другой шаблона и синтаксисе регулярных выражений там. Ваш шаблон глобуса *[2-57]соответствует каждому имени файла, последний символ которого является одной из этих пяти цифр.
Я думаю, вы неправильно помните синтаксис [m,n] квалификатора глобуса . Определители глобуса всегда заключаются в круглые скобки в конце шаблона, а разделитель диапазона - запятая. Шаблон *([2,57])расширяется до 2-го, 3-го,…, 57-го матчей. Порядок расширения по умолчанию - лексикографический (с некоторым специальным волшебством, чтобы сортировать числа в числовом порядке, если numeric_glob_sortопция установлена); Вы можете управлять им с помощью спецификатора oor Oglob (например, *(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>избегает этой проблемы.