Renomeia todos os arquivos em uma pasta para números consecutivos

3

Gostaria de renomear todos os arquivos em uma pasta para ter números consecutivos. Por exemplo:

1.png
2.png
3.png
etc

Eu sei que há o comando renomear e sei que existem DOZENS de perguntas semelhantes aqui, mas não consigo encontrar o caminho.

NOTA : A cópia sugerida não contém uma solução específica para o meu caso. Por favor, pare de sinalizar isso como duplicado, porque a duplicata sugerida não responde à minha pergunta

    
por Adam 06.08.2016 / 21:58

2 respostas

7

Supondo que você queira seguir a ordem de globalização do shell ao classificar os arquivos, faça o seguinte:

#!/bin/bash
counter=0
for file in *; do 
    [[ -f $file ]] && echo mv -i "$file" $((counter+1)).png && ((counter++))
done

Aqui circulando todos os arquivos no diretório atual e renomeando sequencialmente com base na ordem, se você quiser lidar apenas com os arquivos .png , use for file in *.png . A variável counter acompanhará os incrementos.

Esta é uma execução a seco, remova echo para permitir que a ação real de renomeação ocorra.

Exemplo:

$ counter=0; for file in *; do [[ -f $file ]] && echo mv -i "$file" $((counter+1)).png && ((counter++)); done
mv -i file.txt 1.png
mv -i foo.sh 2.png
mv -i bar.txt 3.png
    
por heemayl 06.08.2016 / 22:15
2

Aqui está um pequeno script python que pode fazer o que você pede

Uso básico:

python rename_files.py Pictures/

Ele imprimirá a saída para stdout antes de renomear cada arquivo

Esta versão empurra o índice até que seja encontrado que o nome do arquivo com tal índice não foi obtido. Embora nomes de arquivos possam iniciar em índices diferentes em iterações sucessivas do script, os próprios arquivos permanecem inalterados.

import os
import sys

top_dir = os.path.abspath(sys.argv[1])
files = os.listdir( top_dir )

for index,item in enumerate(files):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files.pop(index)

files.sort()

duplicates = []
last_index = None
for index,item in enumerate(files):

    last_index = index
    extension = ""
    if '.' in item:
        extension = '.' + item.split('.')[-1]
    old_file = os.path.join(top_dir,item)
    new_file = os.path.join(top_dir,str(index) + extension  )
    while os.path.isfile(new_file):
          last_index += 1
          new_file = os.path.join(top_dir,str(last_index) + extension  )
    print( old_file + ' renamed to ' + new_file ) 
    os.rename(old_file,new_file)

Versão alternativa, resolve problemas com nomes de arquivos duplicados, acrescentando timestamp a cada nome de arquivo e, em seguida, enumerando-os. Esta solução pode demorar mais tempo, à medida que o número de arquivos aumenta, mas para diretórios que variam em centenas, isso não vai demorar muito tempo

import os
import sys
import time

top_dir = os.path.abspath(sys.argv[1])
files = os.listdir( top_dir )

for index,item in enumerate(files):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files.pop(index)

files.sort()
timestamp = str(int(time.time()))
for item in files:
    os.rename( os.path.join(top_dir,item) ,
               os.path.join(top_dir, timestamp + item) )

files2 = os.listdir( top_dir )

for index,item in enumerate(files2):
    if os.path.isdir( os.path.join(top_dir,item) ):
       files2.pop(index)

for index,item in enumerate( files2  ):

    last_index = index
    extension = ""
    if '.' in item:
        extension = '.' + item.split('.')[-1]
    old_file = os.path.join(top_dir,item)
    new_file = os.path.join(top_dir,str(index) + extension  )

    while os.path.isfile(new_file):
          last_index += 1
          new_file = os.path.join(top_dir,str(last_index) + extension  )
    print( old_file + ' renamed to ' + new_file ) 
    os.rename(old_file,new_file)
    
por Sergiy Kolodyazhnyy 07.08.2016 / 00:36