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?

Voloda2
fonte
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.)

wjl
fonte
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
Alex Harvey
fonte
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
arsênio
fonte