Como posso renomear todos os arquivos de imagem dentro de um diretório (e recursivamente dentro de seus subdiretórios)?

0

Eu tenho um diretório contendo um grande número de arquivos de imagem, alguns dos quais estão em subdiretórios. Preciso renomear todos os arquivos de imagem que correspondem a *.png, *.jpg, *.jpeg, *.bmp, *.gif usando um padrão simples para renomear:

  • o mesmo prefixo para todos os arquivos;
  • um número com zeros de preenchimento e impresso como string hexadecimal.

Meu objetivo é atribuir um nome exclusivo a todos os arquivos de imagem, independentemente de sua extensão, para que eu possa convertê-los para o mesmo formato de imagem sem o risco de substituir esses arquivos pelos mesmos nomes.

Eu estava escrevendo um script para executar o procedimento acima (para a listagem de diretórios, eu me inspirei no snippet de código de esta resposta ).

for root, dirs, filenames in os.walk(path):
    for filename in filenames:
        if filename.endswith((".jpeg", ".jpg", ".png", ".gif", ".bmp")):
            # rename file

Eu queria saber se havia algum comando bash ou powershell para executar o procedimento acima.

    
por enzom83 03.08.2015 / 18:36

1 resposta

1

Sou mais fluente no Bash, mas tenho certeza que você poderia fazer o mesmo no Power Shell. Estou assumindo que você irá converter para o formato .jpg e armazenar todos os arquivos em um diretório ./output/. Meu script ficaria assim:

j=0;
for i in 'find . -type f \( -iname *.jpg -o -iname *.jpeg -o -iname *.png -o -iname *.gif -o -iname *.bmp \)'
do
    j=$(($j+1))
    convert $i output/'printf "%06X" $j'.jpg
done

Este script irá iniciar um contador '$ j' a partir de 0. Em seguida, ele encontra todos os arquivos que são do tipo file (em vez de diretórios ou links simbólicos ou outras coisas desse tipo) e correspondem às suas extensões especificadas de uma maneira que não diferencia maiúsculas e minúsculas. O () agrupa uma série de itens que são unidos em conjunto com um especificador-o OR para o comando find.

Usamos um loop for para examinar todos os arquivos encontrados, anotando-os com $ i.

Dentro do loop, eu incremento o contador $ j.

Em seguida, eu converto o nome do arquivo como eu encontrei para .jpg e saída para o diretório ./output/.

O nome do arquivo numerado hexadecimal é 0 preenchido com seis dígitos usando um comando printf.

    
por 03.08.2015 / 21:44