Renomeando arquivos para ter extensões de minúsculas com 'renomear'

5

Atualmente, estou tentando renomear um grande conjunto de arquivos e tenho usado métodos bastante kludgy para isso, como:

rename 's:(.*)\.MOV:$1.mov:g' *.MOV
rename 's:(.*)\.JPG:$1.jpg:g' *.JPG

O que eu realmente gostaria de fazer é combinar todos esses comandos usando o ' y ' sed operator . Evidentemente, usando esse operador, você pode transformar itens em minúsculas. O problema é que preciso converter apenas as extensões. Existe uma maneira de fazer isso usando este comando? Eu preciso transformar essencialmente o grupo de captura na expressão a seguir para minúsculas: ^.+\.(.+)$ . Existe uma maneira de fazer isso? Eu sou meio que novo nesses tipos de transformações.

    
por Naftuli Kay 31.08.2011 / 01:23

1 resposta

7

Esse é o rename baseado em Perl encontrado no Debian, Ubuntu e derivados, a julgar pela sintaxe. Você não pode usar o tr operator porque ele age em toda a string. Mas você pode associar a extensão e em minúsculas com \L .

rename 's/\.[^.]*$/\L$&/' *.JPG *.MOV

Aqui é desnecessário, mas se o regexp corresponder mais do que a parte que você quer minúsculas, você pode colocar a parte a ser correspondida em um :

rename 's/\.([^.]*)$/.\L$1/' *.JPG *.MOV

Substitua *.JPG *.MOV por *.* para atuar em todos os arquivos, independentemente da extensão. No bash ≥4.3 (e também no bash 4.0–4.2, com a ressalva de que isso também percorre links simbólicos para diretórios), você pode facilmente agir em arquivos em subdiretórios e assim por diante de maneira recursiva:

rename 's/\.[^.]*$/\L$&/' **/*.*

Para os fãs do zsh (os :r e :e modificadores isolam a extensão do resto do arquivo):

autoload zmv
zmv '*.(MOV|JPG)' '${f:r}.${(L)f:e}'      # these extensions, current directory
zmv '*.*' '${f:r}.${(L)f:e}'              # all extensions, current directory
zmv '**/*.*' '${f:r}.${(L)f:e}'           # all extensions, recursive directory traversal
    
por 31.08.2011 / 01:45