[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>
избегает этой проблемы.
if you want to enumerate files 2 to 57 whether they exist or not, you can use a range brace expression
. Если файлы не существуют и совпадений нет, как расширение скобки узнает, как его расширить? (как бы он расширился иначе, чем глобальный квалификатор?)foo{8..11}bar
расширяется доfoo8bar foo9bar foo10bar foo11bar
. Этот бит расширения не связан с именами файлов. Аналогично,foo{eight,nine,ten,eleven}bar
расширяется доfooeightbar fooninebar footenbar fooelevenbar
. Это расширение скобок в ksh / bash / zsh.Поскольку
[]
квадратные скобки указывают список совпавших символов (которые могут быть цифрами), а не числа интерпретируются математически. Такой шаблон сопоставляется с одним символом. Список может содержать диапазоны, но из цифр или букв.[2-57]
матч расширяется до «Все цифры в диапазоне от 2 до 5 и 7» .Чтобы сопоставить числа от 2 до 57, было бы проще использовать выражение последовательности вместо шаблона слияния (или вместе с ним):
Изменить : Но это, к сожалению, не даст вам лексикографический порядок всех перечисленных файлов - они будут сгруппированы по общим числам окончания из-за расширения оболочки.
источник
[]
печатал вещи по порядку ...[2-57]
верно, но я не думаю{2..57}
(что вы имели в виду, верно?) Имеет отношение к тому, что хочет сделать intrpc, а именно: «выберите файлы со 2 по 57 в лексикографическом порядке».