Могу ли я использовать встроенный подстановочный знак Zsh для замены использования `find` здесь?

Это продолжение другого вопроса, который я опубликовал

Я использую скрипт для автоматического переименования файлов в соответствии с определенным порядком:

#!/usr/bin/env zsh pages=($(sed -n '/page_order/,/^$/ p' _config.yml | tail -n +2 | sed 's/ - //')) npages=${#pages} for ((i=1; i<=$npages; i++)); do page=${pages[$i]} old=${(f)$(gfind . -iregex ".*/.*${page}.md")[1]} # <- the line I hope to replace pagenumber=$(printf '%0*d\n' ${#npages} $i) new="${pagenumber}-${page}.md" mv -i $old $new done 

где _config.yml имеет запись

 page_order: - foo - bar - baz 

так что файлы foo.md bar.md baz.md будут автоматически переименованы в 1-foo.md 2-bar.m 3-baz.md

Есть ли способ полностью пропустить find и просто использовать Zsh globbing? Я использую Zsh 5.1 на Mac OS 10.10, если это вообще помогает; обратите внимание, что первичный -iregex в BSD-версии find который поставляется с OS X, не является стандартным.

  • Могу ли я подавить автозаполнение определенной категории в zsh?
  • Как перечислить все папки в каталоге, не начиная с символа L?
  • Команда Pipe для хвоста: когда первая команда прервана?
  • как мне получить zsh для * просто * перечислить материал в моем текущем каталоге во время завершения табуляции?
  • Удалять удаленные файлы, соответствующие локальным файлам, или удалять файлы по мере их загрузки
  • Могу ли я перемещаться по меню закрытия zsh с помощью vi-подобных клавиш hjkl?
  • Как сделать работу с закладкой ZSH с двумя вкладками
  • Команда Echo с оператором AND не выходит
  • One Solution collect form web for “Могу ли я использовать встроенный подстановочный знак Zsh для замены использования `find` здесь?”

    Я думаю, вы могли бы сделать это с zsh одиночку (то есть с zmv ):

     autoload zmv for name ($pages) zmv -Qn "(**/)(*${name}.md)(.N)" "\${1}${pages[(i)${name}]}-\${2}" 

    -n означает отсутствие выполнения ( dry-run ), поэтому вы получите результат, например:

     mv -- 'some dir/deeper/gfoo.md' 'some dir/deeper/1-gfoo.md' mv -- 'some dir/zfoo.md' 'some dir/1-zfoo.md' mv -- afoo.md 1-afoo.md mv -- nfoo.md 1-nfoo.md mv -- bar.md 2-bar.md mv -- baz.md 3-baz.md ......... 

    если вы довольны результатом, удалите -n для фактического перемещения файлов (или замените его на -i если вы хотите, чтобы он запускался в интерактивном режиме).


    Как это работает:
    $name – это элемент массива, а ${pages[(i)${name}]} – это позиция элемента в массиве, поэтому, если pages=(foo bar baz bom top) то:

      для имени ($ pages)
     printf '% s% s \ n' $ {pages [(i) $ name]} $ name 
     1 foo 2 bar 3 baz 4 bom 5 top 
    Interesting Posts

    Выполнить команду, которая была отображена на экране в виде сообщения

    Любой другой способ определить переменную окружения?

    Каков длинный идентификатор, который Linux присваивает диску в / media /?

    Получить системное уведомление в определенное время?

    Почему система не реагирует, когда сетевая нагрузка составляет 90-95 Мбит / с?

    Установка Anaconda на Chromebook

    подтверждение до sudo su

    Я создал новую группу и нового пользователя. Затем я добавил пользователя в группу. Как я могу перейти к этому пользователю?

    Что произойдет, если файл будет изменен во время его копирования?

    Драйвер исчезает с dev во время копирования ddrescue или восстановления testdisk

    Выполняют ли все задания в оболочке bash именно сеанс?

    ElementaryOS / Конкретная компоновка

    Что делает #var?

    Изменение структуры файла журнала Linux, ненормальное (?) Поведение sed

    kali linux – WiFi подключен, но не может просматривать сеть

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