Créer un dossier par jour

Gregoryen

Membre actif
Club iGen
16 Juin 2013
677
45
33
Arles
www.gregoryen.fr
Bonjour,

J'ai utilisé l'aide de ChatGPT pour créer de nombreux scripts, ce qui m'a été très utile. Cependant, parfois, il y a des obstacles et je passe des après-midis entières à essayer de les surmonter...

Mon objectif est de créer des dossiers allant du 24 mai 2024 jusqu'au 31 juin 2024. Pour cela, je souhaite avoir un dossier par jour, présenté comme suit :
[1] Mer-24-04-2024
[2] Jeu-25-04-2024
etc...

Cependant, le script de ChatGPT me donne ce résultat :

[1] 01] Mer 01-05-2024
[1] 01] Sam 01-06-2024
[1] 24] Mer 24-04-2024
[2] 02] Dim 02-06-2024
[2] 02] Jeu 02-05-2024
[2] 25] Jeu 25-04-2024
[3] 03] Lun 03-06-2024
[3] 03] Ven 03-05-2024
[3] 26] Ven 26-04-2024
[4] 04] Mar 04-06-2024
[4] 04] Sam 04-05-2024
[4] 27] Sam 27-04-2024
etc...
etc...

Il ajoute "01]" avant la date et cela rend la présentation désordonnée.

En outre, j'aimerais que chaque dossier contienne un sous-dossier intitulé "Photos".

Voici le script que ChatGPT m'a fourni :

Bloc de code:
#!/bin/bash

# Chemin du dossier où les dossiers seront créés
folder_path="/Users/gregoryen/Desktop/Secret"

# Assurez-vous que le chemin du dossier existe
mkdir -p "$folder_path"

# Date de début et fin
start_date="2024-04-24"
end_date="2024-06-30"

# Nombre de jours dans chaque mois (pour prendre en compte les mois de 30 et 31 jours)
declare -a days_in_month=(31 30 31 30 31 31)

# Conversion de la date de début en un format plus simple pour la comparaison
start_timestamp=$(date -j -f "%Y-%m-%d" "$start_date" +%s)
current_timestamp=$start_timestamp

# Compteur pour les préfixes
prefix_counter=1

# Mois précédent initialisé avec le mois de départ
previous_month=$(date -j -f "%s" "$start_timestamp" "+%m")

# Boucle pour chaque jour entre le 1er mai 2024 et le 30 juin 2024
while [ "$current_timestamp" -le "$(date -j -f "%Y-%m-%d" "$end_date" +%s)" ]; do
    # Convertir le timestamp en date au format souhaité
    folder_name=$(date -j -f "%s" "$current_timestamp" "+[%d] %a %d-%m-%Y")
  
    # Remplacer le nom anglais du jour par le nom français
    folder_name=$(echo "$folder_name" | sed 's/Mon/Lun/g; s/Tue/Mar/g; s/Wed/Mer/g; s/Thu/Jeu/g; s/Fri/Ven/g; s/Sat/Sam/g; s/Sun/Dim/g')
  
    # Remplacer le numéro du mois par son nom abrégé en français
    month_day=$(date -j -f "%s" "$current_timestamp" "+%d")
    month=$(date -j -f "%s" "$current_timestamp" "+%m")
    if [ "$month" != "$previous_month" ]; then
        prefix_counter=1
        previous_month=$month
    fi
  
    # Ajouter le préfixe au nom du dossier
    folder_name="[$prefix_counter] ${folder_name#*[}"
  
    # Créer le dossier
    mkdir -p "$folder_path/$folder_name"
  
    # Incrémenter le timestamp d'un jour
    current_timestamp=$(($current_timestamp + 86400))
  
    # Incrémenter le compteur de préfixe
    ((prefix_counter++))
done

echo "Les dossiers ont été créés avec succès dans $folder_path."

À terme, j'aimerais intégrer ce processus dans Automator afin que celui-ci me demande la date de début, la date de fin, s'il veut que je crée des sous-dossiers ou non, et si oui, combien et quel serait leur nom.

Je vous remercie de votre aide.
 
  • Snif
Réactions: melaure
Bon j'ai réussi avec Python voir ile script
Bloc de code:
import os
from datetime import datetime, timedelta, date
import locale

# Définir la localisation en français
locale.setlocale(locale.LC_TIME, "fr_FR.UTF-8")

# Fonction pour formater la date selon le modèle souhaité
def format_date(date, index):
    return "[{}] {}-{}-{}".format(index, date.strftime("%a"), date.strftime("%d"), date.strftime("%m-%Y"))

# Fonction pour créer les dossiers avec leurs sous-dossiers "Photos"
def creer_dossier(start_date, end_date, start_week_offset):
    current_date = start_date
    index = 1  # Index pour les numéros de dossier
    chemins = [] # Liste pour stocker les chemins des dossiers créés
    while current_date <= end_date:
        # Récupération du numéro de semaine
        semaine_numero = (current_date - timedelta(days=current_date.weekday())).isocalendar()[1] - start_week_offset
        # Création du nom de dossier formaté avec la semaine
        dossier_name = "Semaine {}".format(semaine_numero)
        # Création du chemin complet du dossier
        dossier_path = os.path.join("/Users/gregoryen/Desktop/Secret", dossier_name)
        # Vérifier si le dossier de la semaine existe, sinon le créer
        if not os.path.exists(dossier_path):
            os.makedirs(dossier_path)
        # Création du sous-dossier "Photos" dans le dossier de la semaine
        dossier_name = format_date(current_date, index)
        dossier_path = os.path.join(dossier_path, dossier_name)
        os.makedirs(os.path.join(dossier_path, "Photos"))
        os.makedirs(os.path.join(dossier_path, "Découpage par tranche de 2 heures"))
        # Ajouter le chemin à la liste
        chemins.append('"' + dossier_path + '"')
        # Passage à la date suivante
        current_date += timedelta(days=1)
        # Incrémenter l'index pour le prochain numéro de dossier
        index += 1
    
    # Création du fichier chemin.txt
    with open("chemin.txt", "w") as f:
        # Écrire chaque chemin dans le fichier, en les séparant par des sauts de ligne
        f.write("\n".join(chemins))

# Définition des dates de début et de fin
date_debut = datetime(2024, 4, 24)  # Début à Mercredi
date_fin = datetime(2024, 6, 30)    # Fin au Samedi
# Définition du décalage pour ajuster le numéro de la semaine
start_week_offset = (date_debut - timedelta(days=date_debut.weekday())).isocalendar()[1] - 1

# Appel de la fonction pour créer les dossiers
creer_dossier(date_debut, date_fin, start_week_offset)

Maintenant ce que j'aimerais faire c'est avec automator, qu'il me demande la date de début et de fin avec le calendrier, le dossier de destination et également, une liste de champs texte, et selon ce que je mets dans ces champs il les crée comme sous dossier.


Si quelqu'un sait je suis preneur ! merci !
 
Salut,
Puisque tu as l'air de maitriser Python, pourquoi ne pas réaliser l'interface avec tkinter ?
 
Mince que je suis bête je pensais l'avoir mis
Bloc de code:
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
import os

# Fonction pour choisir le dossier de destination
def choisir_dossier():
    folder_selected = filedialog.askdirectory()
    if folder_selected:
        dossier_dest_entry.delete(0, tk.END)
        dossier_dest_entry.insert(0, folder_selected)

# Fonction pour lancer la procédure
def lancer_procedure():
    date_debut = date_debut_entry.get()
    date_fin = date_fin_entry.get()
    dossier_dest = dossier_dest_entry.get()

    if not (date_debut and date_fin and dossier_dest):
        messagebox.showerror("Erreur", "Veuillez remplir tous les champs.")
        return

    sous_dossier1 = sous_dossier1_entry.get()
    sous_dossier2 = sous_dossier2_entry.get()
    sous_dossier3 = sous_dossier3_entry.get()

    try:
        os.makedirs(dossier_dest, exist_ok=True)

        if sous_dossier1:
            os.makedirs(os.path.join(dossier_dest, sous_dossier1), exist_ok=True)
        if sous_dossier2:
            os.makedirs(os.path.join(dossier_dest, sous_dossier2), exist_ok=True)
        if sous_dossier3:
            os.makedirs(os.path.join(dossier_dest, sous_dossier3), exist_ok=True)

        messagebox.showinfo("Succès", "Dossiers créés avec succès !")
    except Exception as e:
        messagebox.showerror("Erreur", f"Une erreur s'est produite : {str(e)}")

# Création de l'interface graphique
root = tk.Tk()
root.title("Création de dossiers")

# Définition de la taille de la fenêtre principale
root.geometry("400x300")

# Cadre pour le choix de la date de début
date_debut_frame = tk.Frame(root)
date_debut_frame.pack(pady=10)

# Champ de saisie de la date de début
date_debut_label = tk.Label(date_debut_frame, text="Date de début (JJ/MM/AAAA):")
date_debut_label.grid(row=0, column=0, padx=10, pady=5)
date_debut_entry = tk.Entry(date_debut_frame)
date_debut_entry.grid(row=0, column=1, padx=10, pady=5)

# Cadre pour le choix de la date de fin
date_fin_frame = tk.Frame(root)
date_fin_frame.pack(pady=10)

# Champ de saisie de la date de fin
date_fin_label = tk.Label(date_fin_frame, text="Date de fin (JJ/MM/AAAA):")
date_fin_label.grid(row=0, column=0, padx=10, pady=5)
date_fin_entry = tk.Entry(date_fin_frame)
date_fin_entry.grid(row=0, column=1, padx=10, pady=5)

# Cadre pour le choix du dossier de destination
dossier_dest_frame = tk.Frame(root)
dossier_dest_frame.pack(pady=10)

# Champ de saisie du dossier de destination
dossier_dest_label = tk.Label(dossier_dest_frame, text="Dossier de destination:")
dossier_dest_label.grid(row=0, column=0, padx=10, pady=5)
dossier_dest_entry = tk.Entry(dossier_dest_frame)
dossier_dest_entry.grid(row=0, column=1, padx=10, pady=5)

# Bouton pour choisir le dossier de destination
destination_button = tk.Button(dossier_dest_frame, text="Choisir", command=choisir_dossier)
destination_button.grid(row=0, column=2, padx=10, pady=5)

# Cadre pour les sous-dossiers
sous_dossiers_frame = tk.Frame(root)
sous_dossiers_frame.pack(pady=10)

# Champs pour les sous-dossiers
sous_dossier1_label = tk.Label(sous_dossiers_frame, text="Sous-dossier 1:")
sous_dossier1_label.grid(row=0, column=0, padx=10, pady=5)
sous_dossier1_entry = tk.Entry(sous_dossiers_frame)
sous_dossier1_entry.grid(row=0, column=1, padx=10, pady=5)

sous_dossier2_label = tk.Label(sous_dossiers_frame, text="Sous-dossier 2:")
sous_dossier2_label.grid(row=1, column=0, padx=10, pady=5)
sous_dossier2_entry = tk.Entry(sous_dossiers_frame)
sous_dossier2_entry.grid(row=1, column=1, padx=10, pady=5)

sous_dossier3_label = tk.Label(sous_dossiers_frame, text="Sous-dossier 3:")
sous_dossier3_label.grid(row=2, column=0, padx=10, pady=5)
sous_dossier3_entry = tk.Entry(sous_dossiers_frame)
sous_dossier3_entry.grid(row=2, column=1, padx=10, pady=5)

# Bouton pour lancer la procédure
go_button = tk.Button(root, text="GO", command=lancer_procedure)
go_button.pack(pady=10)

# Lancement de la boucle principale
root.mainloop()
 
Ok, je vois, tu n'appelles pas ta fonction creer_dossier()
Du coup plutôt que d'utiliser tkinter, j'ai utilisé Qt qui est une bibliothèque plus moderne et qui intègre des widgets plus sympas comme QDateEdit() :

Fenetre1.png
Fenetre2.png

Pour ta fonction, j'ai juste un doute :
Si en date de début, je choisis le 04/05/2024, les dossiers créés sont : Semaine 1, Semaine 2, Semaine 3, etc...
Ça ne devrait pas plutôt être Semaine 18, Semaine 19, Semaine 20, etc... ?
 
Wow, tu es un monstre ! En ce qui concerne la notion de semaines, c'est une spécification que j'ai expressément demandée. Lorsque je mentionne la semaine 1, cela ne correspond pas au numéro de semaine dans l'année, mais plutôt à l’événement en question.

Normalement, les noms de dossier suivent ce format : "[1] Sam-04-05-2024". J'aimerais introduire une modification : chaque mardi, ajouter "[ÉVALS]" et chaque samedi, ajouter "[PRIME-X]". Dans ce dernier cas, le "X" représente le nombre de primes jusqu'à présent.

Cependant, l'événement commence un samedi. Donc, le premier samedi et le premier dimanche doivent être inclus dans le dossier de la première semaine, ainsi que la semaine suivante exceptionnellement. Ainsi, dans la semaine 1, nous aurions par exemple :

Semaine 1
[1] Sam-04-05-2024 [PRIME-1]​
[2] Dim-05-05-2024​
[3] Lun-06-05-2024​
[4] Mar-07-05-2024 [ÉVALS]​
[5] Mer-08-05-2024​
[6] Jeu-09-05-2024​
[7] Ven-10-05-2024​
[8] Sam-11-05-2024 [PRIME-2]​
[9] Dim-12-05-2024​
Semaine 2
[10] Lun-13-05-2024​
[11] Mar-14-05-2024 [ÉVALS]​
[12] Mer-15-05-2024​
[13] Jeu-16-05-2024​
[14] Ven-17-05-2024 [PRIME-3]​
[15] Sam-18-05-2024​
[16] Dim-19-05-2024​

J'ai besoin d'une dernière chose, cruciale pour un autre script. Ce script requiert les chemins des dossiers pour effectuer des transferts de fichiers, et chaque chemin doit être avec des guillemets au début et à la fin de chaque chemins. Si possible, ce script pourrait générer un petit fichier texte (nommé chemins.txt) dans le dossier racine contenant tous les chemins des dossiers avec les guillemets appropriés.
et (pour je suis pénible) dans ce même fichier texte avec les chemins, et d'une copie de cette ligne avec en plus le terme "[ACTUELLE]".

Dans le fichier texte par exemple ça serais comme cela:

Bloc de code:
"/Users/gregoryen/Desktop/Evenement/Semaine 1/[1] Sam-04-05-2024 [PRIME-1]"
"/Users/gregoryen/Desktop/Evenement/Semaine 1/[1] Sam-04-05-2024 [PRIME-1] [ACTUELLE]"
"/Users/gregoryen/Desktop/Evenement/Semaine 1/[2] Dim-05-05-2024"
"/Users/gregoryen/Desktop/Evenement/Semaine 1/[2] Dim-05-05-2024 [ACTUELLE]"
etc...


Cela me ferait gagner beaucoup de temps !

Merci énormément pour ton aide !
 
Dernière édition:
Ok, mais hôte moi d'un doute, c'est bien :
[15] Sam-18-05-2024 [PRIME-3] et pas [14] Ven-17-05-2024 [PRIME-3] ??

Oui, dans ton script, tu génères bien un fichier, mais pas à la racine ;-)
 
Dernière édition:
Je crois que l'on est bon !!

Première chose à faire, c'est d'installer PyQt5 à partir du terminal :
Bash:
pip3 install pyqt5

De décompresser l'archive Creation_Dossiers.zip et de lancer Ui_interface.py


N'hésite pas à me faire part de tes commentaires (bugs, améliorations, etc...)
 
Je crois que l'on est bon !!

Première chose à faire, c'est d'installer PyQt5 à partir du terminal :
Bash:
pip3 install pyqt5

De décompresser l'archive Creation_Dossiers.zip et de lancer Ui_interface.py

j'ai entièrement revu ta fonction afin de l'optimiser.

N'hésite pas à me faire part de tes commentaires (bugs, améliorations, etc...)
 
Merci beaucoup ! Alors j'ai testé ça marche plutôt bien !

Il y a un bug quand j'ai voulu mettre une date 04/11/2023 jusqu'au 03/02/2024 cela m'a crée des dossier négatifs.

Screenshot - 04-05-2024 à 19h31 42s - Finder - testdossier.png

Si je le prends de la même année, je n'ai pas de dossier négatif. En revanche, si je le fais dans la même année, le premier samedi et dimanche sont placés dans une semaine séparée au lieu d'être inclus dans la semaine d'après. (Je ne sais pas si je suis clair xD).

À la limite, il faudrais une case a cocher pour dire :
S'il est coché : Oui je fusionne la première semaine avec la deuxième.
S'il n'est pas coché : Il fait le comportement actuel, c'est a dire que mon événement commence le samedi, j'ai dans la semaine 1, le samedi et le dimanche.

Et c'est possible de mettre le calendrier en français, c'est pas une variable du style local à mettre pour çà ?
 
Ah ah ça ne pouvait pas être parfait du premier coup, je regarde ça.
Étrange chez-moi le calendrier est en français !!!!
As-tu regardé le fichier "Chemins.txt" ?
 
Ok :up:
Je ne sais si tu as vu, mais tu peux créer ton dossier de destination quand tu es dans le sélecteur de dossiers (en bas à gauche).
 
Ok :up:
Je ne sais si tu as vu, mais tu peux créer ton dossier de destination quand tu es dans le sélecteur de dossiers (en bas à gauche).
Ah oui c'est super pratique ça, je pensais que c'était directement Finder qui proposait la création de dossiers.
Pour les dates, un autre petit truc c'est que si je veux la modifier manuellement je peux cliquer dessus et jouer avec les flèches + Tab c'est méga pratique comme ça aussi !
 
Je trouve l'interface vraiment géniale ! Ah il y a une petite correction à apporter. Dans mon exemple précédent concernant le chemin et l'ajout de "[ACTUELLE]", je me suis trompé. Il devrait apparaître juste après "Semaine X", plutôt qu'à la fin du chemin. Voici un exemple corrigé pour clarifier :

"/Users/gregoryen/Desktop/testdossier/Semaine 3 [ACTUELLE]/[14] Ven-19-01-2024"