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