zsh: проблемы с переименованием файлов с zmv

Я пытаюсь переименовать файлы с одного расширения на другое (фон: используйте haml вместо erb в моем приложении rails). Я получаю следующий вывод при выдаче команды rename:

% zmv '**/*.erb' $1.haml zmv: error(s) in substitution: app/views/l/links/index.html.erb and app/views/index/index.html.erb both map to .haml app/views/l/links/new.html.erb and app/views/l/links/index.html.erb both map to .haml app/views/l/links/show.html.erb and app/views/l/links/new.html.erb both map to .haml app/views/l/links/stats.html.erb and app/views/l/links/show.html.erb both map to .haml app/views/layouts/application.html.erb and app/views/l/links/stats.html.erb both map to .haml app/views/u/profiles/_form.erb and app/views/layouts/application.html.erb both map to .haml app/views/u/profiles/edit.html.erb and app/views/u/profiles/_form.erb both map to .haml app/views/u/profiles/show.html.erb and app/views/u/profiles/edit.html.erb both map to .haml app/views/u/user_sessions/new.html.erb and app/views/u/profiles/show.html.erb both map to .haml app/views/u/users/_form.erb and app/views/u/user_sessions/new.html.erb both map to .haml app/views/u/users/new.html.erb and app/views/u/users/_form.erb both map to .haml app/views/u/users/show.html.erb and app/views/u/users/new.html.erb both map to .haml 

Может ли кто-нибудь указать мне в правильном направлении, чтобы это исправить?

2 Solutions collect form web for “zsh: проблемы с переименованием файлов с zmv”

Я думаю, что вы действительно хотите что-то вроде этого:

 % zmv '(**/)(*).erb' '$1/$2.haml' # ^$1 ^$2 

Вам нужно использовать скобки для создания групп соответствия, и вы создаете группу соответствия для пути к файлу, а затем группу соответствия для имени файла. Кроме того, вам нужно убедиться, что второй аргумент также находится в одинарных кавычках для zmv.

Кроме того, это действительно хорошая идея, чтобы проверить команды zmv с '-n', прежде чем запускать их (-n скажет вам, что будет переименовано, но на самом деле ничего не переименовать).

Вы должны указать zsh что означает $1 . Есть две возможности:

  • Используйте круглые скобки вокруг частей шаблона источника, который вы хотите использовать. Например, в zmv '(*)/(*).erb' '$1/$2.haml' , '$ 1' означает то, что соответствует первому * а $2 означает то, что соответствует второй $2 .

    [ EDIT (благодаря clee для указания, что (**/) работает)] Скобки немного неудобны для использования с несколькими уровнями каталогов. Если вы пишете (**) , двойная звездочка теряет свое особое значение (только один уровень каталога совпадает). И в основном вы не можете использовать / внутри круглых скобок, поэтому (**/*) не является допустимым шаблоном. Однако особый случай (**/) работает, поэтому вы можете написать zmv '(**/)(*).erb' '$1$2.haml' .

  • Используйте параметр -w , и в этом случае каждый $ N соответствует тексту, сопоставляемому N -тисимволом в шаблоне источника. Например, zmv -w '**/*.erb' '$1/$2.haml' делает то, что вы хотите.

Обратите внимание, что вы всегда должны использовать одинарные кавычки вокруг заменяющего текста (или использовать \$ ), иначе $ s расширяются оболочкой, прежде чем они zmv встроенную команду zmv .

  • Почему модификаторы zsh precommand перестают принимать аргументы при цитировании?
  • Когда необходимо включить `emulate -LR zsh` в функцию, вызванную zsh-виджетами?
  • Функции digest НЕ обрабатываются так же, как каталог файлов функций!
  • Обработать функцию `zsh` с использованием, которая распознает только команды
  • Что означает символ новой строки в PS1 zsh?
  • Получить полный путь к текущему загрузочному файлу zsh (например, zshrc или zshenv)
  • В zsh, в чем смысл идиомы '$ == *'
  • Как разбить вывод команды и назначить результат массиву, используя только одно выражение?
  • FPATH в zsh: функции и функции сайта
  • Ошибка ошибки Zsh в zshrc
  • эквивалент часов в zsh
  • Linux и Unix - лучшая ОС в мире.