Invocando o zmv do bash

0

Eu descobri recentemente essa técnica para renomear arquivos usando zsh :

autoload zmv
zmv '(*).JPG' '$1.jpg'

que eu também posso escrever como:

autoload zmv; zmv '(*).JPG' '$1.jpg'

Isso funciona como anunciado e eu posso usá-lo para alterar a extensão Upper Case JPG para minúscula.

No entanto, eu gostaria de executar isso como um one-liner do meu shell BASH usual. Quando tento chamá-lo da seguinte forma:

zsh -c "autoload zmv; zmv -f '(*).JPG' '$1.jpg'"

ou como:

echo 'autoload zmv; zmv -f "(*).JPG" "$1.jpg"' | zsh -i

Eu recebo algo como a seguinte mensagem

zmv: error(s) in substitution:
….JPG and ….JPG both map to .jpg

Isso sugere para mim que zsh está tratando os nomes de arquivos sem diferenciação de maiúsculas e minúsculas, mas esse não parece ser o caso quando se executa o primeiro caminho.

Obviamente, não sei o que estou fazendo aqui. Eu também tentei inverter as aspas simples e duplas caso a expansão do shell esteja atrapalhando.

Como posso executar este comando como um one-liner do bash?

    
por Manngo 27.10.2017 / 13:24

1 resposta

4

Em:

zsh -c "autoload zmv; zmv -f '(*).JPG' '$1.jpg'"

O $1 é entre aspas duplas, portanto, expandido pelo seu shell ( bash ), provavelmente para a string vazia, então zsh acaba interpretando:

autoload zmv; zmv -f '(*).JPG' '.jpg'

Uso:

zsh -c "autoload zmv && zmv '(*).JPG' '\.jpg'"

Em que a barra invertida cita o $ para bash para remover seu significado especial entre aspas duplas.

Você também pode fazer:

zsh -c "autoload zmv && zmv '(*).(#i)jpg' '\.jpg'"

Em que (#i) deve ativar a correspondência sem distinção entre maiúsculas e minúsculas, para que também renomeie os arquivos .Jpg , .JPg , .jpG ....

Você também pode fazer isso funcionar:

fix_ext_case() {
  EXT=$1 zsh -c "autoload zmv && zmv \"(*).(#i)\$EXT\" '\.\$EXT'"
}

Ou com uma combinação diferente de citações:

fix_ext_case() {
  EXT=$1 zsh -c 'autoload zmv && zmv "(*).(#i)$EXT" "\.\$EXT"'
}

Para ser usado como:

fix_ext_case jpg

ou

fix_ext_case png

(ou fix_ext_case JPG se você deseja converter em maiúsculas).

    
por 27.10.2017 / 13:30