find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
Não tentei os scripts mais elaborados mencionados aqui, mas nenhuma das versões de linha de comando funcionou para mim no meu Synology NAS. renamenão está disponível e muitas das variações de findfalha porque parece aderir ao nome antigo do caminho já renomeado (por exemplo, se encontrar ./FOOseguido por ./FOO/BAR, renomear ./FOOpara ./foocontinuará a ser listado, ./FOO/BARmesmo que esse caminho não seja mais válido) . O comando acima funcionou para mim sem problemas.
A seguir, é apresentada uma explicação de cada parte do comando:
find . -depth -name '*[A-Z]*'
Ele encontrará qualquer arquivo do diretório atual (mude .para o diretório que você deseja processar), usando uma pesquisa aprofundada (por exemplo, listará ./foo/barantes ./foo), mas apenas para arquivos que contenham caracteres maiúsculos. O -namefiltro se aplica apenas ao nome do arquivo base, não ao caminho completo. Portanto, isso listará, ./FOO/BARmas não ./FOO/bar. Tudo bem, pois não queremos renomear ./FOO/bar. ./FOOPorém, queremos renomear , mas esse será listado mais tarde (é por isso que -depthé importante).
Esse comando por si só é particularmente útil para localizar os arquivos que você deseja renomear em primeiro lugar. Use isso após o comando rename completo para procurar arquivos que ainda não foram substituídos devido a erros ou colisões de nomes de arquivos.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
Esta parte lê os arquivos gerados por finde os formata em um mvcomando usando uma expressão regular. A -nopção para sedde imprimir a entrada e o pcomando na regex de pesquisa e substituição gera o texto substituído.
O regex em si consiste em duas capturas: a parte até o último / (que é o diretório do arquivo) e o próprio nome do arquivo. O diretório é deixado intacto, mas o nome do arquivo é transformado em minúsculas. Então, se findsaídas ./FOO/BAR, ele se tornará mv -n -v -T ./FOO/BAR ./FOO/bar. A -nopção de mvgarantir que os arquivos em minúsculas existentes não sejam substituídos. A -vopção produz a mvsaída a cada alteração que faz (ou não faz - se ./FOO/barjá existe, produz algo como ./FOO/BAR -> ./FOO/BAR, observando que nenhuma alteração foi feita). O -Té muito importante aqui - trata o arquivo de destino como um diretório. Isso garantirá que ./FOO/BARnão seja movido para ./FOO/baro diretório existente.
Use isso junto com findpara gerar uma lista de comandos que serão executados (útil para verificar o que será feito sem realmente fazê-lo)
sh
Isso é bastante auto-explicativo. Ele roteia todos os mvcomandos gerados para o interpretador de shell. Você pode substituí-lo por bashqualquer concha que desejar .
ABCdef,abcDEFeaBcDeF? O script de renomeação deve abortar ou apenas avisar e continuar? 2. Como você define letras minúsculas para nomes que não sejam US-ASCII? Se tais nomes estiverem presentes, deve-se primeiro verificar e excluir o passe? 3. Se você estiver executando uma operação de renomeação