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

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 
  • path_helper и zsh
  • zsh: отдельное завершение для имен команд и имен файлов
  • ZSH: `ls * (.)` Перечисляет только обычные файлы, но `ls * (/)` не перечисляет только каталоги
  • Почему ZSH заканчивает линию выделенным символом процента?
  • Режим zsh vi: просмотр последних команд, начиная с
  • Запустите .zshrc при передаче команды через -c
  • Повторно оценивайте выражение запроса каждый раз, когда приглашение отображается в zsh
  • Выключить и перезапустить контрольный код?
  • zsh эквивалент bash show-all-if-twoiguous?
  • О взаимосвязи между инициализацией оболочки и настольными приложениями после «графического входа»
  • Постоянный каталог стеков через сессии в zsh
  • Interesting Posts

    почему на моем рабочем столе работает шесть процессов getty?

    Автоматизируйте бесплатный ARP каждые x секунд

    / dev / консольное динамическое перенаправление

    Wi-Fi карта не обнаружена – Archlinux

    Идентификационные результаты различаются в зависимости от того, кто спрашивает

    Символы / программные ссылки с цветовой координацией на основе того, на что они ссылаются

    Какими процессами порты (в качестве конечных точек связи) относятся к пересылке портов SSH?

    Как получить IP-адрес с помощью сценария оболочки?

    как использовать shell-скрипт с snmpwalk с OID, чтобы иметь идентификатор vlan, имя vlan, порт принадлежит vlans в таблице Excel

    `$ RANDOM` не является случайным в` “ “ “ `Exec“` “ “ “ “ “ “ `

    Получение скорости соединения USB Ethernet

    Пользователь FTP создает файл, который не является исполняемым apache

    Изменить скрипт для использования whiptail вместо zenity

    Как запустить приложение после входа в CentOS?

    как установить curl 7.15.5 libcurl 7.15.5, OpenSSL 0.9.8b, zlib 1.2.3, libidn 0.6.5 в Kali Linux?

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