Многодисковые диапазоны файлов в лексикографическом порядке в zsh

Я хотел бы указать ряд файлов (в лексикографическом порядке) с двумя целыми числами (например, от 2 до 57) в zsh путем подстановки.

Например: «выберите файлы с 2 по 57 в лексикографическом порядке по пути, который соответствует некоторому шаблону глобуса».

  • Самый быстрый способ открыть все файлы в каталоге с несколькими расширениями файлов в командной строке
  • Когда используется ~ + полезно?
  • Исходный контроль и символическая ссылка для .zhistory
  • удалить хост из списка завершения для ssh в zsh
  • пользовательский zsh автозаполнение
  • Почему требуется перезагрузка ежедневной .zshrc с использованием псевдонима, содержащего $ (date -u +% Y% m% d)?
  • Я думал, что использование квадратных скобок сделало бы это

    for x in /foo/bar/*[2-57]; do print $x; done 

    но zsh, по-видимому, думает, что я прошу файлы с 2 по 5 (или что-то в этом роде) вместо файлов с 2 по 57 . Любые мысли почему? Как я могу это сделать?

  • Команда Echo с оператором AND не выходит
  • Как создать цепочку команд?
  • Ярлыки каталогов в буфере emacs
  • Локальные переменные в zsh: что эквивалентно «export -n» bash в zsh
  • история не сохраняется в zsh
  • При использовании zsh tab-completion игнорируйте CDPATH, если локальный файл или каталог совпадают
  • 2 Solutions collect form web for “Многодисковые диапазоны файлов в лексикографическом порядке в zsh”

    [2-57] – набор символов, состоящий из 2 , 3 , 4 , 5 и 7 , в zsh и любой другой подстановочный знак и синтаксис регулярного выражения. Ваш шаблон glob *[2-57] соответствует каждому имени файла, последним символом которого является одна из этих пяти цифр.

    Я думаю, что вы игнорируете синтаксис квалификатора [m,n] glob . В конце шаблона квалификаторы Glob всегда идут в круглых скобках, а разделитель диапазонов – это запятая. Шаблон *([2,57]) расширяется до второго, третьего, …, 57-го совпадений. Заказ расширения по умолчанию – лексикографический (с некоторым специальным волшебством для сортировки чисел в числовом порядке, если установлена ​​опция numeric_glob_sort ); вы можете управлять им с помощью квалификатора o или 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 соответствует * part и 8 соответствует части <2-57> . Шаблон *[^0-9]<2-57> позволяет избежать этой проблемы.

    но zsh, по-видимому, думает, что я прошу файлы с 2 по 5 (или что-то в этом роде) вместо файлов с 2 по 57. Любые мысли почему?

    Поскольку скобки [] указывают список совпадающих символов (которые могут быть цифрами), а не числа, интерпретируемые математически. Такой шаблон сопоставляется с одним символом. Список может содержать диапазоны, но цифры или буквы. [2-57] соответствует расширению до «Все цифры в диапазоне от 2 до 5 и .

    Для сопоставления чисел от 2 до 57 было бы проще использовать выражение последовательности вместо шаблона глобуса (или вместе с ним):

     for x in /foo/bar/*{2..57}; do print $x; done 

    Изменить : Но это, к сожалению, не даст вам лексикографического порядка всех перечисленных файлов – они будут сгруппированы по общим окончаниям номеров из-за расширения оболочки.

    Linux и Unix - лучшая ОС в мире.