1 votes

Comment trouver une chaîne dans le nom de fichier, prendre la chaîne + caractères et l'ajouter en préfixe

Comment puis-je modifier un dossier de fichiers et renommer tous les fichiers de ce dossier en trouvant une chaîne de caractères fixe, puis prendre cette chaîne plus quatre caractères et la déplacer au début du nom de fichier?

Par exemple, j'ai un dossier de photos avec différents noms mais à l'intérieur de chaque nom se trouve la date. Je voudrais prendre cette chaîne de date et la déplacer au début du nom de fichiers.

Voici un nom de fichier:

AK_ADVOUTPOSTB1CHARACTER_20171202_406828017946.jpg

comme vous pouvez le voir, il y a une chaîne de "20171202" dans ce fichier mais chaque fichier peut avoir un mois et un jour différents mais ils sont tous "2017".

Je voudrais donc trouver la chaîne commençant par "2017", puis prendre cela plus les quatre caractères suivants et les déplacer au début du fichier.

Comme solution ultime, je voudrais pouvoir trouver la chaîne "_2017", prendre cette chaîne plus les quatre caractères suivants, les modifier pour ressembler à "2017 12-02", et ensuite placer cela au début du nom.

Exemple de nom de fichier:

AK_ADVOUTPOSTB1CHARACTER_20171202_406828017946.jpg  
2017 12-02 AK_ADVOUTPOSTB1CHARACTER_406828017946.jpg

Si cela prend plusieurs commandes pour accomplir cela, cela me conviendrait, je voudrais juste que cela soit accompli si possible.

(Si vous connaissez un utilitaire qui peut accomplir cela, cela serait également utile.)

0voto

JonathanDavidArndt Points 1174

Le programme Python suivant effectuera ces renommages.

Au début du programme, dans la section Configuration, vous devrez spécifier le motif avec l'année dedans (surtout lorsque cela passe de "2017" à 2018).

Si vous avez besoin de changer les positions de l'année/mois/jour dans le nom du fichier, ces chiffres peuvent être modifiés dans la fonction check_and_update. (Les positions d'indice pour la chaîne "_20171202" peuvent être accessibles en utilisant foundAt.start() et foundAt.end()).

#!/usr/bin/env python

import os
import sys
import traceback
import re

# ----------------------------------------------------------------------
# Configuration

# La chaîne de date qui sera préfixée au début du fichier
year_pattern = "_2017[\d]{2}[\d]{2}"

# Modifier uniquement les fichiers qui correspondent à ce motif
file_patterns = ["(.*)\.jpg$"]

# Répertoire de recherche
start_dirs = ["./"]

# Récursif, vérifier les sous-répertoires
recursive = False

# Afficher la liste des fichiers modifiés, sans apporter de modifications
view_modifications_only = True

# ----------------------------------------------------------------------
def add_ending_slash(s):
    suffix = "/"
    if s.endswith(suffix):
        return s
    return s + suffix

# ----------------------------------------------------------------------
def pattern_matches_any(filename, file_patterns):
    progs = []
    for file_pattern in file_patterns:
        progs.append(re.compile(file_pattern))

    for prog in progs:
        if prog.match(filename):
            return True
    return False

# ----------------------------------------------------------------------
def check_all_dirs(start_dirs):
    total_files = 0
    try:
        for start_dir in start_dirs:
            total_files += check_this_dir(start_dir)
    except Exception as e:
        print('*** Caught exception: %s: %s' % (e.__class__, e))
        traceback.print_exc()
    return total_files

# ----------------------------------------------------------------------
def check_this_dir(start_dir):
    total_files = 0

    try:
        for filename in os.listdir(start_dir):
            filepath = os.path.abspath(add_ending_slash(start_dir) + filename)

            # Fichiers
            if os.path.isfile(filepath):
                total_files += check_and_update(start_dir, filename)

            # Répertoires
            elif recursive and os.path.isdir(filepath):
                total_files += check_this_dir(filepath)
    except PermissionError as e:
        print('*** Caught exception: %s: %s' % (e.__class__, e))
        pass

    return total_files

# ----------------------------------------------------------------------
def check_and_update(start_dir, filename):
    if pattern_matches_any(filename, file_patterns):

        filepath = os.path.abspath(add_ending_slash(start_dir) + filename)

        if (view_modifications_only):
            print("[MATCH]  " + filepath)
        else:
            foundAt = re.search(year_pattern, filename)
            if (foundAt):
                year  = filename[foundAt.end()-8:foundAt.end()-4]
                month = filename[foundAt.end()-4:foundAt.end()-2]
                day   = filename[foundAt.end()-2:foundAt.end()]
                filename_new = year + " " + month + "-" + day + " " + filename[0:foundAt.start()] + filename[foundAt.end():]

                dest = os.path.abspath(add_ending_slash(start_dir) + filename_new)
                print("[UPDATE] " + filepath)
                if (not os.path.isfile(dest)):
                    os.rename(filepath, dest)
                return 1
    return 0

# ----------------------------------------------------------------------
# Corps du programme principal
if (view_modifications_only):
    print("[INFO]   Ce programme est exécuté en mode \"lecture seule\".")

print("[START]  Les fichiers suivants seront renommés :")
total_files = check_all_dirs(start_dirs)
print("[END]    Nombre de fichiers : " + str(total_files))

print()
input("Appuyez sur Entrée pour continuer...")

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