Batch renomeia arquivos para minúsculas

17

Existe uma maneira de renomear todos os arquivos em um diretório para minúsculas | maiúsculas?

Estou procurando um comando oneliner .

Adorei o alt+f7 do TotalCommander, agora preciso dessa funcionalidade no Terminal

    
por Unamata Sanatarai 18.04.2013 / 14:36

3 respostas

20

Para cada arquivo a_file no diretório atual, renomeie a_file para minúscula.

for a_file in *;do mv -v "$a_file" 'echo "$a_file" | tr [:upper:] [:lower:]' ;done;

Para letras maiúsculas, inverta os argumentos para [:lower:] [:upper:]

tr Referência de comando link

Atualizar

Para um controle ainda maior, * pode ser substituído por ls .

Por exemplo, em um diretório contendo 1.txt, 2.txt, 3.txt, 1.jpg, 2.jpg e 3.jpg para filtrar apenas arquivos * .jpg, ls pode ser usado:

for a_file in $(ls *.jpg);do mv -v $a_file 'echo $a_file | tr [:upper:] [:lower:]' ;done;

O código acima atribuirá à variável a_file todos os arquivos com extensão .jpg.

Atualizar adicionou a opção -v ao comando mv conforme sds sugerido.

    
por Stef K 18.04.2013 / 14:57
16

Existe um utilitário mais elegante e geral chamado prename .

Escrito por Larry Wall, ele vem com perl , então provavelmente já está disponível no seu sistema como /usr/bin/prename (se você tiver alternativas de configuração, também pode estar disponível como /usr/bin/rename symlinked via / etc / alternatives to prename )

Ao usá-lo, você pode renomear vários arquivos em um comando, fornecendo qualquer expressão perl (incluindo, mas não se limitando a, substituição s/// ou% transliteração chartr///):

Exemplos:

# Lowercase all *.JPG filenames:
prename tr/A-Z/a-z/ *.JPG

# Change any 'No' in a filename to a 'Yes':
prename s/No/Yes/g *No*

# increment first sequence of digits in a filename by 3:
prename 's/([0-9]+)/$1+3/e' *[0-9]*

# If a file contains 'aaa', append '.bak' to its name
prename 'if (/aaa/) {$_ .= ".bak"}'  *

E assim por diante.

Outra coisa interessante sobre o prename é que ele protege você, no caso de renomear um arquivo para um nome de arquivo existente.

man prename para mais detalhes.

    
por arielf 20.04.2013 / 04:19
1

Usando find

find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;

Por find

  • Claro que após -name colocar seu padrão.
  • -maxdepth 0 : apenas o diretório atual.

Por rename

  • -n, -nono : Nenhuma ação: imprima nomes de arquivos a serem renomeados, mas não renomeie.
  • y/source/dest/ : Transliterar os caracteres no espaço padrão que aparecem na origem para o caractere correspondente em dest.
por Pablo Bianchi 16.03.2017 / 03:27