Altera o nome do arquivo de minúscula para maiúscula recursivamente

3

Eu tenho 1.000.000 de arquivos em algumas pastas e subpastas. Eu quero renomeá-los de minúsculas para maiúsculas usando comandos shell. Eu não quero modificar a extensão. apenas parte do nome do arquivo.

Eu encontrei este aqui:

rename 's/^([^.]*)\.(.*)$/\U$1\E.$2/' *

mas não é recursivo e só funciona em arquivos na pasta atual.

Então eu tentei este aqui:

find . -depth  -execdir rename 's/^([^.]*)\.(.*)$/\U$1\E.$2/' {} \;

Mas nenhum arquivo foi alterado.

Como posso usá-lo recursivamente?

    
por hd. 24.07.2013 / 11:10

4 respostas

3

Supondo que você tenha a renomeação Perl fornecida pelo Debian e distribuições derivadas como Debian e Ubuntu, você está quase lá. O problema é que -execdir passa um nome de arquivo prefixado com ./ para o comando. (A razão para isso é que alguns comandos tratam argumentos que começam com alguns caracteres especialmente; assim, se você tiver um arquivo chamado -foo , ele será passado como ./-foo e, portanto, tratado como um arquivo e não como uma opção). sua regex, isso resulta em $1 estar sempre vazio e, portanto, o novo nome é idêntico ao antigo.

Acomode para este ./ em sua expressão regular.

find . -depth  -execdir rename 's/^(\.\/[^.]*)\.(.*)$/\U$1\E.$2/' {} \;
    
por 25.07.2013 / 03:59
0

find . -type f -exec rename -v 's/(\w+).(\w+)$/\U$1\E.$2/' {} \;

    
por 24.07.2013 / 11:52
0

Você pode usar este pequeno script bash.

#!/bin/bash

find . -type f -exec sh -c  '
    dn='dirname "$1"'
    bn='basename "$1"'
    fn='echo "${bn%.*}"'
    ext='echo "${bn##*.}"'
    FN='echo "${fn^^}"'
    newfn="${FN}"."${ext}"
    #echo ${dn}/$newfn
    if [ "${fn}" = "${FN}" ] ;then : ;else echo "${bn} renamed to ${newfn}";mv "$1" "${dn}/${newfn}";fi
' _ {} \;
    
por 24.07.2013 / 14:20
-1
ls -r | rename 's/^([^.]*)\.(.*)$/\U$1\E.$2/'

Está tudo bem?

    
por 24.07.2013 / 11:35