Batch de extensões de arquivos minúsculos [duplicados]

0

Qual é o comando para renomear as extensões de arquivo de maiúsculas para minúsculas?

Exemplo:

hello.JPG
hi.JPG

para:

hello.jpg
hi.jpg
    
por andesign 19.05.2017 / 12:03

3 respostas

2

Se você sabe com quais extensões de arquivo você está lidando, pode codificá-lo:

for f in *.JPG
do
  mv "$f" "${f%.JPG}.jpg"
done

Para o caso mais geral:

for f in *
do 
  e="${f##*.}"
  b="${f%.*}"
  mv "$f" "${b}.${e,,}"
done

Onde o trabalho pesado é feito com variável bash expansão para:

  • salve a extensão (remova o máximo possível da frente do nome do arquivo até encontrar um ponto)
  • salve o resto do nome do arquivo (remova um período para o final do nome do arquivo, minimamente)
  • renomeie o arquivo para o novo nome de arquivo, minúscula a extensão ( ,, ) no processo
por 19.05.2017 / 12:31
2
rename ' -f and /[A-Z][^.]*$/ and s/\.[^.]+$/\L$&/' *

rename ' -f and s/\.[^.]*[A-Z][^.]*$/\L$&/' *

Precisamos perceber que, sob o capô, rename é apenas Perl code. Pense nisso como: o curinga * alimenta os nomes desse código em loop e em cada um desses nomes executamos as seguintes ações:

  • Teste se o nome atual (armazenado no contêiner de loop $_ ) é um arquivo regular (operador de teste de arquivo -f filename, quando nome do arquivo é omitido, o padrão é $_ ) Nota: Para evitar rename de pensar que o -f que queremos para o nosso arquivo-teste é uma opção para ele usamos um espaço antes do -f para impedir essa possibilidade !!!
  • Seria inútil fazer uma renomeação se um nome de arquivo não tivesse nenhum caractere maiúsculo para começar. Portanto, verificamos esse fato na extensão do nome do arquivo por meio dessa expressão regular: /[A-Z][^.]*$/ Isso examina uma sequência ininterrupta de caracteres não pontilhados vistos do final do nome do arquivo para afirmar que pelo menos uma maiúscula está presente na parte da extensão o nome do arquivo. Isso pode acontecer, que não há extensão para falar. Esse fato é resolvido na próxima etapa, onde também procuramos literal . no nome do arquivo.
  • Agora sabemos que o nome do arquivo atual é um arquivo regular E é um candidato a renomeação devido à presença de pelo menos uma maiúscula. O regex s/\.[^.]+$/\L$&/ isola a porção completa da extensão no nome do arquivo atual, olhando do final do nome do arquivo e olhando para a esquerda e pegando todos os caracteres não-ponto [^.]+ até a hora em que um literal \. é visto. O \L$& ficará todo em maiúsculas - > menor no texto correspondente.
  • Eu adicionei uma segunda versão onde fazemos todo o trabalho em um único comando s/// da verificação de uma maiúscula na extensão.
  • Nota especial: os m// e s/// normalmente são executados em uma sequência anexada por meio do operador =~ , como por exemplo: $var =~ m/[A-Z]+/ $filenm =~ s/ABC/DEF/ . Mas caso a variável em questão seja $_ , podemos dispensar o = ~ e escrevê-la simplesmente m/[A-Z]+/ s/ABC/DEF/ implicará que a variável na qual essas expressões regulares operam é $_ . Além disso, podemos dispensar o m no caso de m// quando os delimitadores forem barras. No entanto, precisamos, no caso de dizer m{} m|| etc. Este é um idioma muito comum em Perl style.
por 19.05.2017 / 13:30
0

Apenas para adicionar outra resposta que ainda não esteja listada:

for f in *.JPG; do mv "$f" "${f//JPG/jpg}"; done
    
por 19.05.2017 / 14:02