zsh: falha em renomear arquivos em lote com zmv

6

Estou tentando renomear em massa os arquivos de uma extensão para outra (background: use haml em vez de erb no meu aplicativo rails). Eu recebo a seguinte saída ao emitir o comando 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

Alguém pode me indicar a direção certa de corrigir isso?

    
por Eimantas 22.08.2010 / 09:47

2 respostas

7

Eu acho que o que você realmente quer é algo assim:

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

Você precisa usar os parênteses para criar grupos de correspondências e criar um grupo de correspondências para o caminho para o arquivo e, em seguida, um grupo de correspondências para o nome do arquivo. Além disso, você precisa certificar-se de que o segundo argumento também esteja entre aspas simples para zmv.

Além disso, é realmente uma boa idéia testar comandos zmv com '-n' antes de executá-los (-n dirá o que será renomeado, mas não renomeia nada.)

    
por 22.08.2010 / 11:03
3

Você precisa informar zsh a que $1 se refere. Existem duas possibilidades:

  • Use parênteses em torno de partes do padrão de origem que você deseja usar. Por exemplo, em zmv '(*)/(*).erb' '$1/$2.haml' , '$ 1' significa o que corresponde ao primeiro * e $2 significa o que corresponde ao segundo $2 .

    [ EDIT (graças a clee por apontar que (**/) funciona)] Os parênteses são um pouco difíceis de usar com vários níveis de diretório. Se você escrever (**) , o asterisco duplo perderá seu significado especial (somente um único nível de diretório será correspondido). E você não pode usar / entre parênteses, então (**/*) não é um padrão válido. No entanto, o caso especial (**/) funciona, portanto você pode escrever zmv '(**/)(*).erb' '$1$2.haml' .

  • Use a opção -w , caso em que cada $N corresponde ao texto correspondido pelo N th caractere curinga no padrão de origem. Por exemplo, zmv -w '**/*.erb' '$1/$2.haml' faz o que você quer.

Observe que você sempre deve usar aspas simples em torno do texto de substituição (ou usar \$ ), caso contrário, os $ s serão expandidos pelo shell antes de chegarem ao comando interno zmv .

    
por 22.08.2010 / 12:14

Tags