Note que você está usando o script Perl chamadorename
distribuído pelo Debian e derivados (Ubuntu, Mint,…). Outras distribuições Linux oferecem um comando completamente diferente e consideravelmente menos útil chamado rename
.
y/A-Z/a-z/
traduz cada personagem na faixa A
através Z
para o personagem correspondente na faixa a
através z
, ou seja ASCII maiúsculas cartas para a letra minúscula correspondente. Para executar a tradução oposta, use y/a-z/A-Z/
. Outra maneira de escrever o mesmo comando é rename '$_ = uc($_)' *
- uc
é a função u cper c ase, e o rename
comando renomeia os arquivos com base na transformação feita na $_
variável.
rename '…' *
renomeia apenas os arquivos no diretório atual, porque é isso que *
corresponde. Os arquivos de ponto (arquivos cujo nome começa com .
) também são ignorados.
Se desejar renomear arquivos no diretório atual e nos subdiretórios recursivamente, você pode usar o find
comando para percorrer o diretório atual recursivamente. Há uma dificuldade aqui: se você ligar rename
, isso renomeia o diretório e a parte do nome base. Se você chamar rename
um diretório antes de retornar a ele ( find -exec rename … {} \;
), find
ficará confuso porque encontrou um diretório, mas esse diretório não existe mais no momento em que tenta descer para ele. Você pode contornar isso, dizendo find
que atravessar um diretório antes de agir sobre ele, mas depois você acaba tentando mudar o nome foo/bar
para FOO/BAR
mas o diretório FOO
não existe.
Uma maneira simples de evitar essa dificuldade é fazer com que o comando de renomeação atue apenas no nome base como parte do caminho. A expressão regular ([^/]*\Z)
corresponde à parte final do caminho que não contém a /
.
find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +
O shell zsh fornece recursos mais convenientes para renomear - ainda mais enigmáticos que o Perl, mas mais tersos e geralmente mais fáceis de compor.
A função zmv
renomeia arquivos com base em padrões. Execute autoload -U zmv
uma vez para ativá-lo (coloque esta linha na sua .zshrc
).
No primeiro argumento para zmv
(o padrão a ser substituído), você pode usar os poderosos padrões curinga do zsh . No segundo argumento para zmv
(o texto de substituição), você pode usar seus recursos de expansão de parâmetros , incluindo modificadores de histórico .
zmv -w '**/*' '$1$2:u'
Explicação:
-w
- atribuir variáveis numéricas automaticamente a cada padrão curinga
**/*
- todos os arquivos em subdiretórios, recursivamente ( **/
corresponde a 0, 1 ou mais níveis de subdiretórios)
$1
- a primeira variável numérica, aqui correspondente à parte do diretório de cada caminho
$2:u
- a segunda variável numérica, que corresponde aqui à parte do nome base de cada caminho, com o :u
modificador para converter o valor em maiúsculas
Como um bônus adicional, isso respeita as configurações de local do ambiente.
Se você não tiver certeza sobre um zmv
comando que escreveu, pode passar a -n
opção de imprimir o que o comando faria e não alterar nada. Verifique a saída e, se fizer o que deseja, execute novamente o comando sem -n
realmente agir.
rename 'y/a-z/A-Z/' *
, conseguirá o que deseja. Cuidado onde você testá-lo.