Renomeando centenas de arquivos de uma só vez para a classificação adequada

22

Eu tenho uma tonelada de arquivos, todos nomeados coisas como 1.jpg , 2.jpg , 3.jpg e assim por diante até 1439.jpg , no entanto, eu tenho um problema com um dos meus projetos e em ordem alfabética. Geralmente, ele vai no pedido 1.jpg , 10.jpg , 11.jpg e assim por diante.

O que eu preciso é alguma forma de nomear os arquivos para que eles estejam no formato 00001.jpg até 01439.jpg .

Como eu seria capaz de fazer isso de maneira rápida e eficiente?

    
por Kaz Wolfe 28.05.2014 / 05:55

6 respostas

33

O Ubuntu vem com um script chamado rename . É apenas um pequeno script Perl que apresenta vários recursos poderosos de renomeação em massa, mas o melhor (neste caso) é a capacidade de executar Perl durante a substituição. O resultado é uma solução verdadeiramente compacta:

rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

Isso é semelhante às outras respostas de printf no estilo aqui, mas tudo é feito para nós. O código acima é para um número de 5 dígitos (incluindo um número variável de zeros à esquerda).

Ele procurará e substituirá a primeira string numérica que encontrar com uma versão com preenchimento zero e deixará o restante do nome do arquivo sozinho. Isso significa que você não precisa se preocupar muito em carregar qualquer extensão ou prefixo.

Nota: isso não é totalmente portátil. Muitas distribuições usam rename.ul do pacote util-linux como seu padrão rename binário. Esta é uma alternativa significativamente atrofiada (veja man rename.ul ) que não entenderá o que foi dito acima. Se você quiser isso em uma plataforma que não está usando a renomeação do Perl, descubra como instalá-lo primeiro.

E aqui está um equipamento de teste:

$ touch {1..19}.jpg

$ ls
10.jpg  12.jpg  14.jpg  16.jpg  18.jpg  1.jpg  3.jpg  5.jpg  7.jpg  9.jpg
11.jpg  13.jpg  15.jpg  17.jpg  19.jpg  2.jpg  4.jpg  6.jpg  8.jpg

$ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg

$ ls
00001.jpg  00005.jpg  00009.jpg  00013.jpg  00017.jpg
00002.jpg  00006.jpg  00010.jpg  00014.jpg  00018.jpg
00003.jpg  00007.jpg  00011.jpg  00015.jpg  00019.jpg
00004.jpg  00008.jpg  00012.jpg  00016.jpg

E um exemplo de prefixos (não estamos fazendo nada diferente):

$ touch track_{9..11}.mp3 && ls
track_10.mp3  track_11.mp3  track_9.mp3

$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3  track_10.mp3  track_11.mp3
    
por Oli 28.05.2014 / 11:37
20
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then  mv $f 'printf "%.5d" "${f%.*}"'.jpg  ; fi ; done

Editar

Explicação:

  • if [[ $f =~ [0-9]+\. ]] garante que apenas os arquivos cujos nomes são números (seguidos de um ponto) estejam sendo renomeados.
  • printf "%.5d" NUMBER adiciona os zeros à esquerda
  • "${f%.*}" corta a extensão (.jpg) e deixa apenas o número
  • .jpg após o segundo backtick adicionar a extensão do arquivo novamente.

Observe que isso funcionará apenas em nomes de arquivos que são números. Preencher com zeros à esquerda os arquivos não numerados exigiria um formato diferente.

Se você quiser experimentar, tente este comando:

for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f 'printf "%.5d" "${f%.*}"'.jpg  ; fi ; done

Editar 2

Tornou o comando mais seguro certificando-se de que apenas nomes de arquivos que são números estão sendo renomeados. Observe que todos os arquivos pré-existentes nomeados como 00001.jpg serão sobrescritos.

    
por sмurf 28.05.2014 / 06:02
6

Abaixo de um script python.

O script adiciona zeros à esquerda até o número definido de dígitos. Se o nome for maior que isso, o arquivo (nome) não será tocado.

A combinação de extensões diferentes em uma ação de renomeação pode adicionar alguma conveniência. Para adicionar extensão (s), basta adicioná-los à tupla, por exemplo extensions = (".jpg", ".jpeg", ".tiff") .

Copie o texto em um arquivo vazio, salve-o como rename.py , digite o caminho correto para o diretório de arquivos ( sourcedir ), o número de dígitos que você gostaria que os novos nomes tivessem ( number_ofdigits ) e a (s) extensão (ões) do arquivo para renomear ( extensions )

Execute-o pelo comando:

python3 /path/to/script/rename.py

O script:

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")

files = os.listdir(sourcedir)
for item in files:
    if item.endswith(extensions):
        name = item.split("."); zeros = number_ofdigits-len(name[0])
        newname = str(zeros*"0")+name[0]+"."+name[1]
        shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)

edit:

Abaixo de uma versão ligeiramente melhorada. Ele determina automaticamente o nome mais longo no diretório e adiciona zeros à esquerda até o comprimento do nome mais longo.

exemplo:

1.jpg
12.jpg
123.jpg

torna-se:

001.jpg
012.jpg
123.jpg

Não é necessário definir o número de dígitos.

#!/usr/bin/python3

import shutil
import os

sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))

for item in files:
    zeros = maxlen-len(item[2])
    shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])
    
por Jacob Vlijm 28.05.2014 / 06:33
2

Existe um utilitário de renomeação implementado em Perl que torna isso muito fácil:

rename 's/\d+/sprintf("%05d",$&)/e' *.jpg

O primeiro argumento é uma expressão Perl que é avaliada para cada nome de arquivo.

    
por Mats Kindahl 28.05.2014 / 11:46
0

Existe uma GUI que fará isso chamado pyRenamer, que pode ser encontrado nos repositórios. Instale, inicie, selecione seu diretório e apenas defina o 'Padrão de nome de arquivo renomeado' como '{num5}' na guia 'Padrões' e clique no botão 'Renomear'. Você também pode visualizar o que acontecerá antes de renomear.

    
por user287888 28.06.2014 / 07:32
-4
for file in '(find * -maxdepth 1 -type f -name "*.jpg")'     
do    
  mv $file "000"$file    
done

Isso é grosseiro, já que ele não renomeia de forma inteligente, precisará pensar em um truque para isso. Mas isso deve ajudá-lo a classificar as coisas.

Atualização: você tem uma resposta mais completa.

    
por Swarnendu Biswas 28.05.2014 / 06:02