7 votes

Renommer tous les fichiers d'un dossier en numéros consécutifs

Je voudrais renommer tous les fichiers d'un dossier pour qu'ils aient des numéros consécutifs. Par exemple :

1.png
2.png
3.png
etc

Je sais qu'il y a la commande renommer et je sais qu'il y a DOZENS de questions similaires ici, mais je n'arrive pas à trouver le chemin.

NOTE : Le duplicata suggéré ne contient pas de solution spécifique à mon cas. S'il vous plaît, arrêtez de signaler cette question comme étant un doublon, car le doublon suggéré ne répond pas à ma question.

9voto

heemayl Points 85741

En supposant que vous voulez suivre l'ordre de globbing Shell tout en triant les fichiers, vous pouvez le faire :

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

Ici, on boucle sur tous les fichiers du répertoire courant et on les renomme séquentiellement en fonction de l'ordre, si vous voulez traiter uniquement le fichier .png utiliser les fichiers for file in *.png à la place. counter gardera la trace des incréments.

C'est un essai, enlevez echo pour que l'action de renommage proprement dite ait lieu.

Exemple :

$ 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

3voto

Sergiy Kolodyazhnyy Points 97292

Voici un petit script Python qui peut faire ce que vous demandez

Utilisation de base :

python rename_files.py Pictures/

Il imprimera la sortie vers stdout avant de renommer chaque fichier

Cette version pousse l'index jusqu'à ce qu'il soit constaté que le nom de fichier avec un tel index n'est pas pris. Bien que les noms de fichiers puissent commencer à un index différent lors d'itérations successives du script, les fichiers eux-mêmes restent inchangés.

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)

Version alternative, résout le problème des noms de fichiers en double en ajoutant l'horodatage à chaque nom de fichier, puis en les énumérant. Cette solution peut prendre plus de temps, car le nombre de fichiers augmente, mais pour les répertoires qui se comptent en centaines, cela ne prendra pas beaucoup de temps.

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)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X