Bonjour
Je cherche à faire coder un petit script permettant :
Aller chercher en mode récursif les fichiers avec l'extension ".NEF" sur la carte SD que j'enfiche dans mon ordinateur portable. Les fichiers sont dans 2 sous niveaux de dossiers.
Renommer ces fichiers en les numérotant sur 5 chiffres (ex: 00001.NEF)
Sauvegarder sur le disque dur le dernier numéro à prendre pour que la numérotation continue à la prochaine recherche sur la carte SD.
Créer (ou tester) l'existence du dossier Images sur le disque dur de mon ordinateur sous Linux Debian, créer ou tester la présence d'un sous répertoire pour l'année en cours (pas celle des images) et créer ou tester un sous répertoire du quantième du jour. Et disposer les images de la carte SD dans le dossier du quantième du jour.
J'en ai besoin pour ma pratique de photographe amateur.
J'ai demandé à l'IA de faire cela. Le script fonctionne sauf qu'il ne trouve pas ma carte SD enfichée dans mon ordinateur. Il trouve bien mon disque dur externe mais pas le lecteur de carte SD.
Je cherche la solution pour que la carte SD soit accéssible avec ce script que je vous indique ici :
#!/usr/bin/env python3
import os
import shutil
import sys
import time
from datetime import datetime
# Configuration
BASE_DIR = os.path.expanduser("~/Images")
NUM_FILE = os.path.join(BASE_DIR, "last_number.txt")
FILE_TYPES = ['.NEF', '.JPG', '.JPEG', '.CR2', '.ARW', '.DNG'] # Ajoutez d'autres extensions si nécessaire
def get_removable_devices():
"""Retourne la liste des périphériques amovibles montés"""
devices = []
with open('/proc/mounts', 'r') as f:
for line in f:
parts = line.split()
if parts[1].startswith('/media/philippe/') or parts[1].startswith('/mnt/'):
devices.append(parts[1])
return devices
def get_next_number():
"""Récupère ou initialise le prochain numéro de fichier"""
try:
with open(NUM_FILE, 'r') as f:
last_num = int(f.read().strip())
except (FileNotFoundError, ValueError):
last_num = 0
return last_num + 1
def update_last_number(number):
"""Met à jour le dernier numéro utilisé"""
os.makedirs(os.path.dirname(NUM_FILE), exist_ok=True)
with open(NUM_FILE, 'w') as f:
f.write(str(number))
def get_target_path(file_path):
"""Détermine le chemin cible basé sur la date du fichier"""
# Essayez d'abord avec la date de modification
mtime = os.path.getmtime(file_path)
file_date = datetime.fromtimestamp(mtime)
year = file_date.year
day_of_year = file_date.timetuple().tm_yday
# Crée les dossiers si nécessaire
year_dir = os.path.join(BASE_DIR, str(year))
day_dir = os.path.join(year_dir, f"{day_of_year:03d}")
os.makedirs(day_dir, exist_ok=True)
return day_dir
def copy_and_rename_files():
"""Copie et renomme les fichiers des périphériques amovibles"""
devices = get_removable_devices()
if not devices:
print("Aucun périphérique amovible détecté.")
return
next_num = get_next_number()
files_copied = 0
for device in devices:
print(f"Traitement du périphérique: {device}")
for root, _, files in os.walk(device):
for file in files:
ext = os.path.splitext(file)[1].upper()
if ext in FILE_TYPES:
src_path = os.path.join(root, file)
try:
target_dir = get_target_path(src_path)
new_name = f"{next_num:05d}{ext.lower()}"
dest_path = os.path.join(target_dir, new_name)
# Copie le fichier
shutil.copy2(src_path, dest_path)
print(f"Copié: {src_path} -> {dest_path}")
next_num += 1
files_copied += 1
except Exception as e:
print(f"Erreur lors du traitement de {src_path}: {e}")
if files_copied > 0:
update_last_number(next_num - 1)
print(f"\n{files_copied} fichiers copiés. Dernier numéro utilisé: {next_num - 1}")
else:
print("Aucun fichier correspondant trouvé.")
def main():
print("=== Script de copie et organisation de fichiers ===")
print(f"Base directory: {BASE_DIR}")
try:
copy_and_rename_files()
except KeyboardInterrupt:
print("\nOpération annulée par l'utilisateur.")
sys.exit(1)
except Exception as e:
print(f"Une erreur s'est produite: {e}")
sys.exit(1)
if __name__ == "__main__":
main()
# ça n'existe pas déjà cet outil ?
Posté par lejocelyn (site web personnel) . Évalué à 5 (+3/-0).
Hum, y'a un truc qui me dérange à demander à des gens de corriger un script obtenu par ia…
Sinon, il me semble que ce genre de fonction d'import et renommage de fichiers existe déjà dans les logiciels de gestion de photos. Lesquel utilisez vous ?
[^] # Re: ça n'existe pas déjà cet outil ?
Posté par ǝpɐןƃu∀ nǝıɥʇʇɐW-ǝɹɹǝıԀ (site web personnel) . Évalué à 5 (+3/-0).
Après ça reste une question purement Linux : pourquoi quand la carte SD est-elle montée, n'apparaît-elle pas dans /mnt/ ou /media/philippe ? Alors que le disque dur, visiblement, oui.
N'ayant pas d'indications sur la distribution employée, les points de montage, et nom d'utilisateur, je ne vois pas trop comment aider. Mais la question me semble avoir sa place dans ce forum. Après tout, tout le monde ne peut pas être programmeur. Ici, l'auteur de la question a déjà fait (faire) une très grosses parties du boulot, et ne demande quasiment rien en comparaison de sa problématique initale… C'est super. Même si c'est à base de LLM.
« IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace
[^] # Re: ça n'existe pas déjà cet outil ?
Posté par gaaaaaAab . Évalué à 4 (+2/-0).
je pense que la distrib est un point important. Je suis pas sûr que toutes les distribs fassent de l'auto-montage de cartes SD par défaut.
(Perso, je pense même que c'est une assez mauvaise idée d'auto-monter les supports qui peuvent se retirer mécaniquement sans avertir l'OS, mais c'est p-e que moi.)
[^] # Re: ça n'existe pas déjà cet outil ?
Posté par BAud (site web personnel) . Évalué à 3 (+1/-0).
bin il nous aurait donné le résultat de
df -h
quand la carte SD est présente, ça permettrait de voir le point de montage…[^] # Re: ça n'existe pas déjà cet outil ?
Posté par BAud (site web personnel) . Évalué à 3 (+2/-1).
eh bien, perso, j'aimerais que l'auteur de l'entrée de forum (re-)lise la doc du wiki aide-edition pour remettre en forme le code (il y a un bouton
Modifier
dans les entrées de forum).En attendant, je ne répondrai pas :p
[^] # Re: ça n'existe pas déjà cet outil ?
Posté par GuieA_7 (site web personnel) . Évalué à 6 (+4/-0).
Alors qu'il suffisait de demander à l'IA de coder sans bug #tipsdepro
[^] # Re: ça n'existe pas déjà cet outil ?
Posté par espéranto . Évalué à 1 (+0/-0).
J'utilise le très bon logiciel libre "Darktable" (darktable.fr ou .org) mais celui-ci n'a pas de fonction permettant la numérotation. Il peu renommer les fichiers à l'importation mais pas en simple numérotation perpétuelle. Ce que je souhaiterais.
# Linux debian
Posté par espéranto . Évalué à 1 (+2/-2). Dernière modification le 22 juin 2025 à 20:35.
Je suis sous linux debian version stable actuelle.
N'étant pas développeur du tout, je n'ai pas les connaissances pour mettre mon script aux formes voulues dans ce forum, j'en suis désolé.
Je souhaite simplement un petite aide pour résoudre mon problème.
A vous de voir …
[^] # Re: Linux debian
Posté par ǝpɐןƃu∀ nǝıɥʇʇɐW-ǝɹɹǝıԀ (site web personnel) . Évalué à 4 (+2/-0).
Pouvez-vous :
— insérer votre carte sd
— taper dans un terminal : df -h
— nous communiquer le résultat de cette commande
— et le résultat du script que vous souhaitez employer ?
« IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace
[^] # Re: Linux debian
Posté par espéranto . Évalué à 2 (+1/-0). Dernière modification le 26 juin 2025 à 18:11.
Sur ma carte SD les images sont Dans :
NIKON D500 / DCIM / 101ND500
Il s'agit de fichiers ayant un nom comme ça : _DSC0578.NEF
Voilà pour les manœuvres demandées.J'espère que ça ira pour vous.
En vous remerciant de porter attention à mon problème.
[^] # Re: Linux debian
Posté par gaaaaaAab . Évalué à 3 (+1/-0).
puis ('\040' représente l'espace en octal, un peu étonnant que ce soit en octal mais bon, pourquoi pas)
ton diagnostic était incorrect, le script trouve bien la carte SD
mais le script ne descend pas dans les sous répertoires.
[^] # Re: Linux debian
Posté par ǝpɐןƃu∀ nǝıɥʇʇɐW-ǝɹɹǝıԀ (site web personnel) . Évalué à 3 (+1/-0).
Dommage. Et apparemment, ce ne serait pas non plus l'espace dans le nom de périphérique : j'ai tenté chez moi au cas où, mais ça ne pose pas de problème.
Est-il possible d'ajouter les print() suivant (les lignes terminant par PMA) dans la section du code correspondante :
De faire tourner le script et de nous indiquer le résultat ?
NB : faites bien attention à l'alignement des instructions dans les boucles. Python est sourcilleux sur ce point.
« IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace
[^] # Re: Linux debian
Posté par gaaaaaAab . Évalué à 3 (+1/-0).
c'est pas à moi qu'il faut répondre :)
mais ce sont des printf peu utiles. Le fait que le script ne descende pas dans les sous répertoires, c'est mon diagnostic, pas mon constat.
os.walk renvoie des triplets (dirpath, dirname, filename). Le script ignore les dirname en les affectant à '_'
[^] # Re: Linux debian
Posté par ǝpɐןƃu∀ nǝıɥʇʇɐW-ǝɹɹǝıԀ (site web personnel) . Évalué à 2 (+0/-0).
Chez moi la boucle
descend bien dans les sous répertoires. Aucun problème avec ça.
« IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace
[^] # Re: Linux debian
Posté par gaaaaaAab . Évalué à 3 (+1/-0).
ah oui, ça faisait longtemps que j'avais pas utilisé os.walk
Après avoir relu la donc, l'api est pas super intuitive sur l'intérêt de dirnames
[^] # Re: Linux debian
Posté par espéranto . Évalué à 1 (+0/-0). Dernière modification le 26 juin 2025 à 18:12.
Dans la carte SD il y a bien des fichiers .NEF
Il y a 2 périphériques de branchés sur port usb. Le disque dur externe et la carte SD.
Quand je laisse le disque dur externe branché avec la carte SD enfichée, il va lire le disque dur, Sur ce disque dur le script entre dans "media/philippe/DDE/20250623/philippe/Images/Club Photo/20250427_0630.NEF -> /home/philippe/Images/2025/117/0045.nef
Je ne pensais pas qu'en 2025 demander à l'informatique d'aller chercher des fichiers sur un support pour le copier sur un autre en les renommant soit si fastidieux.
Merci de m'être occupé de mon problème. On va arrêter-là. Je ne veux pas abuser de votre temps.
Merci quand même
Philippe
[^] # Re: Linux debian
Posté par BAud (site web personnel) . Évalué à 5 (+4/-1).
franchement ?!
Qu'est-ce qui est dur de modifier ton entrée de forum ? (bouton
modifier
en fin d'entrée) et ajouter :En outre, utiliser le lien
Répondre
permet de conserver l'arborescence des réponses pour savoir à quoi tu réponds ;-)[^] # Re: Linux debian
Posté par gUI (Mastodon) . Évalué à 4 (+1/-0). Dernière modification le 23 juin 2025 à 08:43.
J'ai fait la modification. Mais n'hésite pas à aller regarder comment ça marche pour la prochaine fois ;)
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Linux debian
Posté par gaaaaaAab . Évalué à 4 (+2/-0).
On y voit plus clair, merci !
Et on voit le danger des scripts générés par LLM pour les non développeurs. Hormis le problème à l'origine de ce message (le fait que la carte SD ne soit pas trouvée), ça a l'air de bien marcher, mais il y a un gros MAIS:
si, pour une raison quelconque, le fichier last_num.txt (qui sert à stocker le dernier numéro utilisé) est perdu (effacé, corrompu, …), le script va le réinitialiser à 0. (Jusque là, tout va bien).
Et ensuite, il va faire la copie (shutil.copy2(src_path, dest_path)) sans vérifier si le fichier de destination existe déjà (à moins que shutil.copy2 s'occupe de ça, mais j'ai pas l'impression).
Et donc, si le last_num.txt est remis à 0 ou n'existe pas, le script va potentiellement écraser des fichiers présents dans le répertoire de destination.
C'est un peu fragile de stocker cette info de dernier numéro utilisé dans un fichier. ça me paraîtrait mieux d'aller le calculer à la volée, ou de le passer en paramètre de la ligne de commande (quitte à le stocker automatiquement dans ce fichier, mais au moins, on contrôle la numérotation à l'exécution)
Une question non technique: est-ce que ça serait pas mieux d'avoir une numérotation par répertoire (c'est à dire par date) plutôt qu'une numérotation globale ?
Je ne parle pas de la forme, qui est … hmmm comment dire … discutable. (Entre autres, comme on sait que t'aimes bien lancer des programmes dans tes programmes, on a mis un main dans ton main :D )
Et y a des infos qui mériteraient d'être des arguments du script plutôt que fixés par le script.
ça n'a aucun sens d'appeler os.makedirs(os.path.dirname(NUM_FILE), exist_ok=True) dans le update_last_number. Si le répertoire n'existe pas déjà, le script n'arrivera jamais jusque là.
c'est la première fois que je regarde du code généré par LLM, c'est en même temps impressionnant, et en même temps insuffisant. Je sais qu'il y a beaucoup de discussions autour de l'utilisation d'agents, de comment il faut écrire le prompt, etc. Mais c'est plus un sujet pour un nourjal.
[^] # Re: Linux debian
Posté par gUI (Mastodon) . Évalué à 6 (+3/-0).
On peut même dire que de manière générale, tester un script qui lit/écrit/modifie des fichiers comme ça, en copier/coller de l'Internet (ici c'est de l'IA mais ça aurait été depuis stackoverflow le pb serait le même), sans trop comprendre ce qu'il fait est très dangereux.
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
# faire plus simple
Posté par ChocolatineFlying . Évalué à 2 (+3/-2).
En général, pour les débutants, c’est mieux de faire en plusieurs étapes, et chaque étape est plus simple ou utilise un outil déjà existant.
Comme cela, ton IA y arrive un peu mieux, c’est plus simple pour elle comme pour toi.
Si j’ai bien compris ton besoin, tu pourrais par exemple utiliser rsync pour aller chercher les nouveaux fichiers sur ta carte SD et les copier sur ton disque/répertoire voulu. Il ne va copier que les nouveaux fichiers qui sont sur ta carte SD par rapport au répertoire de destination.
DESCRIPTION
rsync est un outil de copie de fichiers rapide et extraordinairement polyvalent. Il peut copier localement, vers/depuis un autre hôte via un shell distant, ou vers/depuis un démon rsync distant. Il offre un grand nombre d’options qui contrôlent tous les aspects de son comportement et permettent une spécification très flexible de l’ensemble des fichiers à copier. Il est célèbre pour son algorithme de transfert delta, qui réduit la quantité de données envoyées sur le réseau en ne transférant que les différences entre les fichiers source et les fichiers existants dans la destination.
Depuis ce répertoire, tu lances un script bash (plutôt que Python :) certaines IA sont plus à l’aise avec et c'est plus simple pour retoucher le script par tes soins ) qui renomme les derniers fichiers .nef comme tu le souhaites,
puis un second script qui les déplace dans les répertoires que tu veux, avec quantième, etc.
Chaque étape : un script. Avec le temps, tu vas petit à petit voir ce que tu peux améliorer, et réduire cela progressivement ou l’optimiser.
Comme il s’agit de petits scripts, beaucoup d’IA peuvent t’aider à améliorer cela progressivement.
on peu se dire c'est bon c'est facile mais en réalité pas trop pour un grand débutant sous linux.
# c'est bon
Posté par espéranto . Évalué à 1 (+0/-0).
zip
A force de demander à l'IA de modifier mon petit logiciel de transfert, j'y suis arrivé, enfin. Ce truc me suffit. Il trouve enfin mon lecteur SD, trouve les fichiers, il les renomme et il les copie sur mon disque dur en sauvant le prochain numéro à prendre.
[^] # Re: c'est bon
Posté par ChocolatineFlying . Évalué à 0 (+0/-1).
il est d'usage de poster le code complet plutot qu'un lien qui va mourrir un jour, meme si c'est fait par l'IA
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.