Script Python pour corriger les extensions de fichiers mv --backup=numbered

Après avoir utilisé mv --backup=numbered, vous vous retrouverez avec beaucoup de fichiers portant des noms tels que

mv_backup_before.txt
001.jpg.~1~
001.jpg.~2~
001.jpg.~3~

etc.

Le script Python suivant renomme ces fichiers en

mv_backup_after.txt
001.1.jpg
001.2.jpg
001.3.jpg

en préservant l’extension de fichier d’origine.

fix_mv_backup_numbered.py
#!/usr/bin/env python3
import os
import re
import argparse

def rename_backup_files(directory, recursive=False):
    # Expression régulière pour correspondre aux fichiers comme "161.jpg.~2~"
    pattern = re.compile(r"^(.*)\.\~(\d+)\~$")

    # Obtenir tous les fichiers du répertoire courant
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)

        # Si recursive est True et que l'élément est un répertoire, le traiter
        if recursive and os.path.isdir(item_path):
            rename_backup_files(item_path, recursive)
            continue

        match = pattern.match(item)
        if match:
            base_name = match.group(1)  # par ex., "161.jpg"
            number = int(match.group(2))  # par ex., 2

            # Extraire le nom de fichier de base et l'extension
            name, ext = os.path.splitext(base_name)

            # Créer le nouveau nom de fichier
            new_filename = f"{name}.{number}{ext}"

            # Incrémenter le nombre jusqu'à ce que le nouveau nom de fichier soit unique
            while os.path.exists(os.path.join(directory, new_filename)):
                number += 1
                new_filename = f"{name}.{number}{ext}"

            # Renommer le fichier
            old_path = os.path.join(directory, item)
            new_path = os.path.join(directory, new_filename)
            os.rename(old_path, new_path)
            print(f"Renamed: {os.path.join(directory, item)} -> {os.path.join(directory, new_filename)}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Rename backup files in a directory.")
    parser.add_argument("directory", type=str, help="Path to the directory containing the files to rename.")
    parser.add_argument("-r", "--recursive", action="store_true",
                      help="Recursively process subdirectories")
    args = parser.parse_args()

    rename_backup_files(args.directory, args.recursive)

Check out similar posts by category: Python, Linux