Posso usar o utilitário Renomear para simplificar esse script que usa Find e Mv?

1

Eu uso um script para renomear arquivos automaticamente de acordo com uma ordem específica:

#!/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]}
  pagenumber=$(printf '%0*d\n' ${#npages} $i)
  new="${pagenumber}-${page}.md"
  mv -i $old $new
done

onde _config.yml tem a entrada

page_order:
 - foo
 - bar
 - baz

para que os arquivos foo.md bar.md baz.md sejam automaticamente renomeados para 1-foo.md 2-bar.m 3-baz.md .

Existe uma maneira de simplificar esse processo usando o utilitário rename ? Estou usando o Mac OS X 10.10.

(Para uma solução zsh pura, consulte Posso usar a correspondência de caractere curinga do Zsh para substituir o uso de 'localizar' aqui? )

    
por shadowtalker 27.09.2015 / 07:38

1 resposta

3

Se você puder obter sua lista de arquivos como um conjunto de argumentos para o rename do Perl, isso pode ser feito facilmente:

rename 'no warnings; $a++; s!^(.*/)?(.*)!$1$a-$2!' "$@"

As variáveis $a e $b são globais pré-declaradas em Perl, portanto, embora a expressão inteira deva ser considerada dentro de um loop (e com escopo definido), elas manterão seus valores durante toda a execução. A própria substituição insere o valor atual de $a como parte do nome do arquivo, permitindo que o argumento também seja um nome de caminho. (Nós dividimos o argumento em dirname e basename , resultando em componentes $ 1 e $ 2.)

O no warnings pragma interrompe a substituição reclamando do componente de nome de caminho ausente. Isso normalmente não seria necessário, mas acho que o comando rename tem avisos extras habilitados.

Adicione -n para execução a seco ou -v para ação com confirmação.

Como alternativa, você pode usar um snippet de perl para obter os parâmetros que você tem e aplicá-los a um conjunto de arquivos. Mas quando você fizer isso, você pode também analisar o YAML em Perl também.

    
por 27.09.2015 / 13:06