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

  • Oh-My-Zsh удаляет дублированный путь в стеке каталогов
  • ZSH: разбиение первых N файлов по пути в лексикографическом порядке
  • gnome-terminal: небольшой зазор в правой части экрана (Ubuntu)
  • Как включить обратный поиск в zsh?
  • Могу ли я использовать `rm` только при использовании globbing? (либо в bash, либо в zsh, либо в обоих)
  • обмена или синхронизации истории между Zsh и Bash
  • Как реализовать «генераторы», такие как $ RANDOM?
  • Задания zsh и команды unznow bzr
  • 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 - лучшая ОС в мире.