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. rename
não está disponível e muitas das variações de find
falha porque parece aderir ao nome antigo do caminho já renomeado (por exemplo, se encontrar ./FOO
seguido por ./FOO/BAR
, renomear ./FOO
para ./foo
continuará a ser listado, ./FOO/BAR
mesmo 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/bar
antes ./foo
), mas apenas para arquivos que contenham caracteres maiúsculos. O -name
filtro se aplica apenas ao nome do arquivo base, não ao caminho completo. Portanto, isso listará, ./FOO/BAR
mas não ./FOO/bar
. Tudo bem, pois não queremos renomear ./FOO/bar
. ./FOO
Poré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 find
e os formata em um mv
comando usando uma expressão regular. A -n
opção para sed
de imprimir a entrada e o p
comando 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 find
saídas ./FOO/BAR
, ele se tornará mv -n -v -T ./FOO/BAR ./FOO/bar
. A -n
opção de mv
garantir que os arquivos em minúsculas existentes não sejam substituídos. A -v
opção produz a mv
saída a cada alteração que faz (ou não faz - se ./FOO/bar
já 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/BAR
não seja movido para ./FOO/bar
o diretório existente.
Use isso junto com find
para 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 mv
comandos gerados para o interpretador de shell. Você pode substituí-lo por bash
qualquer concha que desejar .
ABCdef
,abcDEF
eaBcDeF
? 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