Могу ли я использовать встроенный подстановочный знак 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, не является стандартным.

  • Почему не работает: while true; do "$ my_command"; сон 1; сделанный
  • ZSH: разбиение первых N файлов по пути в лексикографическом порядке
  • Есть ли команда для переключения на режим vicmd в zsh?
  • Функции, определенные в .zshrc, не найдены при запуске скрипта
  • Zsh, возможно, добавляет кавычки к переменной значения (работает в bash, хотя)
  • Получение команды tree для отображения каталогов
  • ZSH, vcs_info, Mercurial и Trac: странная ветка и ревизия
  • Множественные замены в zsh?
  • 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 
    Linux и Unix - лучшая ОС в мире.