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
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
Respostas:
Para cada arquivo a_file
no diretório atual, renomeie a_file
para 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:]
tr
link 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, 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á à a_file
variável todos os arquivos com extensão .jpg.
Atualize a-v
opção adicionada ao mv
comando conforme o sds sugerido.
Existe um utilitário mais elegante e geral chamado prename
.
Escrito por Larry Wall, ele vem com perl
ele, 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/rename
link 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.
find
find . -name * -type f -exec rename 'y/A-Z/a-z/' '{}' \;
find
-name
colocar o seu padrão.-maxdepth 0
: Somente diretório atual.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.
mv
ver o que está sendo feito; que você pode não querer passar "-f" porque isso pode espancar os arquivos existentes