Apenas arquivos de renomeação recursiva do Linux

1

Estou tentando renomear recursivamente todos os arquivos dentro de um diretório e subdiretórios para letras minúsculas, mas deixando os nomes dos diretórios inalterados.

Todos os exemplos que eu encontrei renomear arquivos e diretórios para minúsculas, por exemplo:

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"

e

find . -type f|while read f; do mv "$f" "$(echo $f|tr '[:upper:]' '[:lower:]')"; done

Como posso manter diretórios inalterados, mas renomear todos os arquivos?

    
por Don Smythe 13.12.2014 / 09:12

1 resposta

2

Você obtém renomear os nomes dos diretórios porque o comando find retorna o caminho completo dos nomes dos arquivos e o comando renomear fez a renomeação também base no nome do diretório. Portanto, se você tiver um arquivo no diretório DIR1/FILE , ele será renomeado para dir1/file enquanto você não quiser renomear o diretório.

Aqui está o comando para renomear apenas o nome dos arquivos:

find . -type f -exec rename -n 's:([^/]*$):lc($1):e' {} +

No comando acima, ([^/]*$) corresponde apenas à última parte do caminho que não contém / dentro de um par de parênteses (...) , o que torna a parte correspondida como um grupo de correspondências. Em seguida, traduza a parte correspondente ( $1 é o índice do primeiro grupo correspondente) para minúsculas com a função lc() .

No momento, você precisa montar a opção -n para renomear os arquivos reais.

-exec ... {} + is for commands that can take more than one file at a time (eg cat, stat, ls). The files found by find are chained together like an xargs command. This means less forking out and for small operations, can mean a substantial speedup. [answer by @Oli]

    
por 13.12.2014 / 10:10