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


23

Eu tenho uma tonelada de arquivos, todo o material nomeado como 1.jpg, 2.jpg, 3.jpge assim por diante até 1439.jpg, no entanto, eu tenho um problema com um dos meus projetos e alfabetização. Ele geralmente vai na ordem 1.jpg, 10.jpg, 11.jpge assim por diante.

O que eu preciso é de uma maneira de nomear os arquivos para que eles estejam no formato, até 00001.jpgo final 01439.jpg.

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


O que você está procurando é "classificação natural", talvez isso ajude: askubuntu.com/questions/41390/…
Fabian Blechschmidt

Resposta que não é direta? ls -v unix.stackexchange.com/questions/33909/…
WernerCD

+1 porque tentei fazer isso sem êxito pyrenamer.
Parto 28/05

@FabianBlechschmidt, eu preciso disso em um programa que não é para nautilus ou similar. É para um projeto individual.
Kaz Wolfe

Eu acho que você pensou em implementar a classificação natural? Mas eu entendo, renomear arquivos é bastante fácil e, se funcionar, ótimo :) #
Fabian Blechschmidt

Respostas:


35

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 (nesse caso) é a capacidade de executar o Perl durante a substituição. O resultado é uma solução verdadeiramente compacta:

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

Isso é semelhante às printfrespostas do outro estilo aqui, mas é tudo tratado por nós. O código acima é para um número de 5 dígitos (incluindo um número variável de zeros à esquerda).

Ele pesquisará e substituirá a primeira sequência numérica encontrada por uma versão preenchida com zero e deixará o restante do nome do arquivo em paz. 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.uldo util-linuxpacote como seu renamebinário padrão . 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 esteja 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 prefixo (não estamos fazendo nada de 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

Se eu fosse uma pessoa Perl, essa seria a solução perfeita. Realmente limpo.
MGP 28/05

2
Ele não usa nenhum perl, apenas uma ferramenta fornecida que já está escrita em perl.
Rob

1
Neste caso, faz envolver um único comando Perl, mas não é exatamente o trabalho pesado. sprintfno Perl se comporta de maneira semelhante sprintfem outros idiomas.
Oli

21
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 sejam números (seguidos de um ponto) sejam renomeados.
  • printf "%.5d" NUMBER adiciona os zeros iniciais
  • "${f%.*}" corta a extensão (.jpg) e deixa apenas o número
  • .jpgapós o segundo backtick, adiciona a extensão do arquivo novamente.

Observe que isso funcionará apenas em nomes de arquivos que são números. Os zeros à esquerda do preenchimento esquerdo para arquivos não numerados exigiriam 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 números sejam renomeados. Observe que todos os arquivos preexistentes nomeados como 00001.jpg serão substituídos.


Este script de liner funciona 'out of box' no Ubuntu e em outras distribuições Linux! 😃 Não é necessário instalar nenhuma ferramenta adicional usando perl, python, etc.
HEXcube

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) será intocado.

A combinação de extensões diferentes em uma ação de renomeação pode adicionar alguma conveniência. Para adicionar extensões, basta adicioná-las à 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ê deseja que os novos nomes tenham ( 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)

editar:

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

exemplo:

1.jpg
12.jpg
123.jpg

torna-se:

001.jpg
012.jpg
123.jpg

Não há necessidade de 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])

2

Há um utilitário de renomeação implementado no Perl que facilita muito isso:

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

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


0

Existe uma GUI que fará isso chamada pyRenamer, que pode ser encontrada 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 da renomeação.


Embora sua resposta funcione, observe que esta é uma shell-scriptingseção, o que significa que estou procurando uma resposta na linha de comando. Além disso, você pode fornecer mais detalhes sobre o programa? Por exemplo, qual é o formato do padrão {num5}?
Kaz Wolfe

-4
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`     
do    
  mv $file "000"$file    
done

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

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


2
renomeia 1439.jpg como 0001439.jpg.
Avinash Raj

Sim, eu sei, apenas zeros extras preenchidos que ainda devem funcionar com o tipo.
Swarnendu Biswas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.