Zsh
zmv -o-i '(**/)(*)' '$1${2:l}'
Explicações: zmv
renomeia arquivos que correspondem a um padrão de acordo com o texto de substituição fornecido. -o-i
passa a opção -i
para cada comando mv
sob o capô (veja abaixo). No texto de substituição, $1
, $2
, etc, são os sucessivos grupos entre parênteses no padrão. **
significa todos os diretórios (sub) *, recursivamente. O% final (/)
não é um grupo entre parênteses, mas um qualificador glob que significa corresponder apenas aos diretórios. ${2:l}
converte $2
em minúsculas.
Perl renomear
Aqui eu uso o script de renomeação Perl que o Debian e o Ubuntu enviam como /usr/bin/prename
(normalmente disponível como rename
também). Com bash ≥4 ou zsh:
shopt -s globstar # only in bash
rename 's!/([^/]*/?)$!\L/$1!' **/*
Com outros shells:
find . -depth -exec rename -n 's!/([^/]*/?)$!\L/$1!' {} +
Portátil
Recursivamente:
find . -depth -exec sh -c '
t=${0%/*}/$(printf %s "${0##*/}" | tr "[:upper:]" "[:lower:]");
[ "$t" = "$0" ] || mv -i "$0" "$t"
' {} \;
O uso de -depth
garante que diretórios profundamente aninhados sejam processados antes de seus ancestrais.