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?

Kaz Wolfe
fonte
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
Oli
fonte
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.

surf
fonte
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])
Jacob Vlijm
fonte
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.

Mats Kindahl
fonte
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.

user287888
fonte
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.

Swarnendu Biswas
fonte
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