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

Мое избранное:

UNIX is basically a simple operating system, but you have to be a genius to 
understand the simplicity.
    Dennis Ritchie

И:

One of my most productive days was throwing away 1000 lines of code.
    Ken Thomson
6
22.08.2010, 10:47
2 ответа

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

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

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

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

7
27.01.2020, 20:24
  • 1
    , К сожалению (по крайней мере, до zsh 4.3.10), (**)/ соответствия точно один уровень каталога, т.е. ** теряет его особое значение и эквивалентен *. Так эта команда работы, но не имеет подразумеваемого смысла. –  Gilles 'SO- stop being evil' 22.08.2010, 13:16
  • 2
    @Gilles: Да, у меня был он, исправляются в первый раз, и затем я отредактировал его, потому что я глуп. Однако (**/) работает правильно, таким образом, я собираюсь обновить сообщение к тому, что я имел первоначально так, чтобы это было корректно. –  clee 22.08.2010, 14:16

Необходимо сказать zsh что $1 относится к. Существует две возможности:

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

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

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

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

3
27.01.2020, 20:24

Теги

Похожие вопросы