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:
Abra Terminal.app, digite cde arraste e solte na janela a pasta que contém os arquivos a serem renomeados.
Para confirmar que você está no diretório correto, digite lse pressione Enter.
Cole este código e pressione Enter:
for f in*;do mv "$f""$f.tmp"; mv "$f.tmp""`echo $f | tr "[:upper:]" "[:lower:]"`";done
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.)
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
Respostas:
Se você estiver confortável com o terminal:
cd
e arraste e solte na janela a pasta que contém os arquivos a serem renomeados.ls
e pressione Enter.Cole este código e pressione Enter:
ls
e 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.)
fonte
foo.txt
eFOO.TXT
, isso pode destruir um deles.mv "$f" "${f,,}"
declare -l g=$f; mv "$f" "$g"
for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
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):
Você também precisa lidar com espaços em nomes de arquivos (qualquer sistema operacional):
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):
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:
fonte
Uma versão de concha de peixe:
fonte