Como faço para renomear todos os arquivos para letras minúsculas?


122

Eu tenho, por exemplo, TREE.wav, ONE.WAV. Eu quero renomear para tree.wav, one.wav. Como faço para renomear todos os arquivos para letras minúsculas?


1
Você está confortável com uma solução Terminal / shell? Ou você deseja que o código C / Objective-C faça isso?

A solução do terminal estará ok.
Voloda2,

3
Acho que isso deveria ser reaberto. o código do terminal também é código
Danield

1
Esta deve ser uma questão válida no stackoverflow. Isso também é código.
adev

Respostas:


370

Se você estiver confortável com o terminal:

  1. Abra Terminal.app, digite cde arraste e solte na janela a pasta que contém os arquivos a serem renomeados.
  2. Para confirmar que você está no diretório correto, digite lse pressione Enter.
  3. Cole este código e pressione Enter:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
  4. Para confirmar que todos os seus arquivos estão em letras minúsculas, digite lse pressione Enter novamente.

(Obrigado a @bavarious no Twitter por algumas correções e obrigado a John Whitley abaixo por tornar isso mais seguro em sistemas de arquivos que não diferenciam maiúsculas de minúsculas.)


9
Seja cuidadoso. Se você tiver arquivos com o nome foo.txte FOO.TXT, isso pode destruir um deles.
Keith Thompson,

1
Com o bash, você pode simplesmente fazer mv "$f" "${f,,}"declare -l g=$f; mv "$f" "$g"
:,

2
Eu tentei todos esses comandos, obtive "mv: 'PPP.txt' e 'ppp.txt' são o mesmo arquivo" e não minúscula meu arquivo ... alguma idéia? É porque está no mesmo diretório?
lorless

1
user2066039: Deve ser algo recente no Mac, porque a maioria das respostas com mais de um ano não conta para isso. Concluí a tarefa usando uma extensão intermediária como 'jpg1'. Portanto, JPG -> jpg1 -> jpg. Espero que ajude.
Joyce

14
Os usuários do OS X devem renomear cada arquivo com um nome temporário primeiro devido ao sistema de arquivos que não diferencia maiúsculas de minúsculas, por exemplo: for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
John Whitley

10

A pergunta feita é geral e também importante, portanto, desejo fornecer uma resposta mais geral:

O caso mais simples (seguro na maioria das vezes e no Mac OS X, mas continue lendo):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

Você também precisa lidar com espaços em nomes de arquivos (qualquer sistema operacional):

IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done

Você precisa lidar com segurança com nomes de arquivos que diferem apenas por maiúsculas e minúsculas em um sistema de arquivos com distinção entre maiúsculas e minúsculas e não sobrescrever o destino (por exemplo, Linux):

for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done 

Nota sobre o Mac OS X:

O sistema de arquivos do Mac não faz distinção entre maiúsculas e minúsculas, preservando maiúsculas e minúsculas.

No entanto, não há necessidade de criar arquivos temporários, como sugerido na resposta e comentários aceitos, porque dois nomes de arquivo que diferem apenas por caso não podem existir em primeiro lugar, ref .

Para mostrar isso:

$ mkdir test
$ cd test
$ touch X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 X
$ mv X x
$ ls -l 
total 0
-rw-r--r--  1 alexharvey  wheel  0 26 Sep 20:20 x

Sim - mas seu exemplo sugere que você pode usar nomes de arquivo em minúsculas usando 'mv X x'. Então foi só isso que eu comentei.
cpaludan

mojave 10.14.5: # touch X x # ls -la total 0 -rw-r - r-- 1 root root 0 Jun 24 15:19 X # mv X x mv: 'X' e 'x' são iguais arquivo # ls -la -rw-r - r-- 1 root root 0 24 de junho 15:19 X
cpaludan

Desculpe pela formatação ruim. ASSIM não foi gentil comigo lá.
cpaludan

1
E meu mal - estava em um ssh no meu framboesa em uma unidade compartilhada (formatado hfsplus) - aí não funciona. Mas, localmente, no meu mac, sim.
cpaludan

para i em *; do j = $ (tr '[: superior:]' '[: inferior:]' <<< "$ i"); mv "$ i" "$ j"; trabalhou para mim na Catalina. Obrigado.
Sinan Eldem

2

Uma versão de concha de peixe:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.