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


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

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

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


22
2018-05-28 03:55


origem


O que você está procurando é "ordenação natural", talvez isso ajude: askubuntu.com/questions/41390/… - Fabian Blechschmidt
Responda que não é uma resposta direta? ls -v  unix.stackexchange.com/questions/33909/… - WernerCD
+1 porque eu tentei sem sucesso fazer isso em pyrenamer. - Parto
@ 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 ordenação natural? Mas eu entendo, renomear arquivos é muito fácil e se faz o trabalho, ótimo :) - Fabian Blechschmidt


Respostas:


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 ao outro printfestilo de respostas 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 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: isto não é completamente portátil. Muitas distribuições usam rename.ul de util-linux pacote como padrão rename binário. Esta é uma alternativa significativamente atrofiada man rename.ul) que não vai entender o que precede. 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

33
2018-05-28 09:37



Se eu fosse uma pessoa Perl, esta seria a solução perfeita. Realmente puro. - MGP
Não usa nenhum perl, apenas uma ferramenta fornecida que já está escrita em perl. - Rob
Neste caso, faz envolvem um único comando Perl, mas não é exatamente um trabalho pesado. sprintf em Perl se comporta semelhante ao sprintf em outras línguas. - Oli♦


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 por um ponto) estejam sendo renomeados.
  • printf "%.5d" NUMBER adiciona os zeros à esquerda
  • "${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. Preencher o zeros à esquerda para arquivos não numerados exigiria 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.


20
2018-05-28 04:02





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á alterado.

Combinar 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 roteiro:

#!/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 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 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])

6
2018-05-28 04:33





Existe um utilitário de renomeação implementado no 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.


2
2018-05-28 09:46





Existe uma interface gráfica 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.


0
2018-06-28 05:32



Enquanto a sua resposta FUNCIONA, por favor note que esta é uma shell-scripting seção, o que significa que estou procurando uma resposta de linha de comando. Além disso, você pode fornecer mais detalhes sobre o programa? Por exemplo, qual formato de padrão é {num5}? - Kaz Wolfe


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

Isso é grosseiro, já que não renomear inteligentemente, vai precisar pensar em um truque para isso. Mas isso deve ajudá-lo a classificar as coisas.

Update: Bem, você tem uma resposta mais completa.


-4
2018-05-28 04:02



ele renomeia 1439.jpg como 0001439.jpg. - Avinash Raj
Sim, eu sei, apenas zeros extras preenchidos que ainda deveriam funcionar com o tipo. - Swarnendu Biswas