Posso usar a correspondência curinga integrada do Zsh para substituir o uso de 'find' aqui?

1

Este é um follow-up para outra pergunta que publiquei

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]}  # <- the line I hope to replace
  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 pular find inteiramente e apenas usar Zsh globbing? Estou usando o Zsh 5.1 no Mac OS 10.10 se isso ajudar em tudo; observe que o -iregex primary na versão BSD de find que vem com o OS X não é padrão.

    
por shadowtalker 27.09.2015 / 18:28

1 resposta

1

Acho que você poderia fazer isso com zsh sozinho (ou seja, com zmv ):

autoload zmv
for name ($pages)
zmv -Qn "(**/)(*${name}.md)(.N)" "\${pages[(i)${name}]}-\"

o -n significa que não há execução ( dry-run ), então você terá uma saída como:

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
.........

se você está feliz com o resultado, remova o -n para realmente mover os arquivos (ou substitua-o por -i se você quiser que ele seja executado no modo interativo).

Como funciona:
$name é o elemento da matriz e ${pages[(i)${name}]} é a posição do elemento na matriz, portanto, por exemplo, if pages=(foo bar baz bom top) then:

for name ($pages)
printf '%s %s\n' ${pages[(i)$name]} $name
1 foo
2 bar
3 baz
4 bom
5 top
    
por 11.02.2016 / 22:30