Atribua a todos os arquivos uma extensão .jpg

8

Eu tenho um diretório e algumas extensões dos arquivos estão em maiúsculas (.JPG) em vez de minúsculas.

Quero garantir que cada arquivo tenha .jpg como extensão. Como eu faria isso a partir de um prompt de shell?

Mark Flint
fonte
É uma pena que o Linux não tenha AppleScript.
13133 gadgetmo
2
É tão bom que o Linux não possui AppleScript.
math

Respostas:

15

Usando a expansão de parâmetros do shell :

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

Os "personagens cuidam dos nomes de arquivos que contêm espaços, como costumam fazer as fotografias.

Johnsyweb
fonte
5
+1 Esta solução funciona mesmo se você tiver espaços no nome do arquivo, mas você quer dizer "$ f" em vez de "f".
Adam Zalcman 8/02
A expansão dos parâmetros do shell é um pouco enigmática; pode-se usar o nome da base: for f in * .JPG; do mv "$ f" "` nome do base $ f .JPG`.jpg "; done
math
@ math: Eu prefiro a minha versão, pois trabalha com nomes de arquivos que contêm espaços em branco e também funcionará /path/to/*.JPG. Você está convidado a apresentar a sua própria resposta, é claro :)
Johnsyweb
É claro que o nome da base removerá os diretórios principais, mas funcionará com espaços dentro dos nomes de arquivos. (Eu não acho que isso vale a pena de uma resposta;) para que eu postei isso como um comentário)
matemática
10

Se você pode usar ferramentas externas (não apenas o bash), verifique o renamecomando!

rename .JPG .jpg *

O renamefaz parte util-linux.

uzsolt
fonte
renomear é ... problemático. Existe uma versão de renomeação perlque aceita argumentos diferentes para fazer a mesma coisa.
cha0site
Você poderia explicar um pouco mais? Qual versão BTW?
math
3

Se você possui espaços nos nomes de arquivos:

for f in *.JPG; do [[ -f "${f}" ]] && mv "${f}" "${f/%JPG/jpg}"; done
cha0site
fonte
2

Eu sugeriria dar uma olhada no mmvcomando. É adequado exatamente para esse tipo de tarefa. No seu cenário, seria:

#> mmv "*.JPG" "#1.jpg"

A página de manual está cheia de exemplos, portanto, não leva tempo para se acostumar.

Nos sistemas Debian , pode ser instalado com:

#> aptitude install mmv
Alessandro Dotti Contra
fonte
0

se você não tiver espaços nos nomes de arquivos:

for f in *.JPG; do mv $f `echo $f | sed 's/JPG$/jpg/'`; done
Karoly Horvath
fonte
11
Seria fácil fazer isso funcionar para arquivos com espaços no nome: basta adicionar aspas duplas ao redor dos dois argumentos mv.
Adam Zalcman 8/02
Eu não tenho espaços. O que eu adiciono para que isso aconteça no diretório CURRENT. No momento em que eu recebo o erro - mv: Can't stat `* .JPG ': Não existe esse arquivo ou diretório
Mark Flint
11
você não tem JPGs lá.
Karoly Horvath