Renomear arquivos em lote 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 TotalCommander alt+f7, agora preciso dessa funcionalidade no Terminal

Unamata Sanatarai
fonte

Respostas:

20

Para cada arquivo a_fileno diretório atual, renomeie a_filepara letras minúsculas.

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

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

trlink de referência de comando

Atualizar

Para ainda mais controle *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, lspode 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á à a_filevariável todos os arquivos com extensão .jpg.

Atualize a-v opção adicionada ao mvcomando conforme o sds sugerido.

Stef K
fonte
4
você pode passar "-v" para mvver o que está sendo feito; que você pode não querer passar "-f" porque isso pode espancar os arquivos existentes
sds
Isso não funciona para arquivos com espaços em seus nomes.
Tianxiang Xiong
Você pode usar aspas ao redor do nome do arquivo.
Stef K
2
Desculpe, mas a parte sobre ls * jpg é uma ideia. mywiki.wooledge.org/ParsingLs Você pode obter o mesmo resultado com * jpg ao longo do local onde estava * em primeiro lugar.
21816
16

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

Escrito por Larry Wall, ele vem com perlele, provavelmente já está disponível no seu sistema, pois /usr/bin/prename(se você tiver alternativas de instalação, também poderá estar disponível como /usr/bin/renamelink simbólico via / etc / alternative to prename)

Com ele, você pode renomear vários arquivos em um comando, fornecendo qualquer expressão perl (incluindo, sem limitação, substituição s///ou transliteração de char tr///):

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 nome do arquivo é que ele protege você, no caso de renomear um arquivo para um nome de arquivo existente.

man prename para mais detalhes.

arielf
fonte
1

Usando find

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

Para find

  • Claro que depois de -namecolocar o seu padrão.
  • -maxdepth 0: Somente diretório atual.

Para rename

  • -n, -nono: Nenhuma ação: imprima os nomes dos arquivos a serem renomeados, mas não renomeie.
  • y/source/dest/: Translitera os caracteres no espaço do padrão que aparecem na fonte para o caractere correspondente em dest.
Pablo Bianchi
fonte