AppleScript : Renommage avec ExifTool date créa des vidéos photos

BellO666

Membre enregistré
28 Octobre 2013
3
0
Bonjour,
J'ai récupérer le script de renommage photos ou vidéos (tout type d'extension) pour renommer les fichiers avec la date Exiftool de création.
Script de : (de 2022)

@zeltron54

Par contre, sur ce script, j'ai une erreur. Si un 'expert' pouvait m'aider. Je comprends la logic, mais pas la technique d'écriture du script.
Je met aussi une image du nommage d'origine des fichiers.
Capture d’écran 2026-02-01 à 14.59.55.webp
L'erreur est : error "Erreur dans Finder : Impossible d’effectuer l’opération car il existe déjà un élément de ce nom." number -48

Et l'erreur est sur la ligne
Bloc de code:
        set name of lefichier to newnom
Je vous en remercie par avance. Sachant que mon but est de récupérer la date création Exif des fichiers vidéos, photos, quelques soient le type (mp4, MOV, jpg, HEIC etc...) pour renommer le fichier avec YYYY_MM_DD-HH_MM_SS-Nom d'origine. extension d'origine

AppleScript:
tell application "Finder"
    set source to choose folder with prompt "Selectionner le dossier Source"
    set dest to choose folder with prompt "Selectionner le dossier  Destination"
   
    make new folder at ((path to desktop folder) as string) with properties {name:"Transfert_tmp"}
    set dossiertmp to (path to desktop folder) & "Transfert_tmp" as string
    set les_fichiers to files of source
    repeat with chaque_fichier in les_fichiers
        duplicate chaque_fichier to dossiertmp
    end repeat
end tell

try
    do shell script "/opt/homebrew/bin/exiftool"
    set exiftool_PATH to "/opt/homebrew/bin/exiftool"
on error
    set exiftool_PATH to "/usr/local/bin/exiftool"
end try

tell application "Finder"
    set Chemin to (path to desktop folder) & "Transfert_tmp" as string
    set Chemin to Chemin as alias
end tell

tell application "Finder"
   
    set les_fichiers to files of Chemin
    repeat with chaque_fichier in les_fichiers
       
        set lefichier to chaque_fichier
        set AppleScript's text item delimiters to {""}
        set nom to name of chaque_fichier
        set chaque_fichier to chaque_fichier as string
        try
            set datephoto to do shell script exiftool_PATH & " -DateTimeOriginal " & quoted form of POSIX path of chaque_fichier
            if datephoto is "" then set datephoto to do shell script exiftool_PATH & " -CreationDate " & quoted form of POSIX path of chaque_fichier
            if datephoto is "" then set datephoto to do shell script exiftool_PATH & " -CreateDate " & quoted form of POSIX path of chaque_fichier
        on error
            set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
            write "Le fichier ne contient pas de date  : " & chaque_fichier & return to lelog starting at eof
            close access lelog
           
            set datephoto to ""
        end try
       
        if length of datephoto > 20 then
            set x to (length of datephoto) - 33
            set DateOriginale to text -x thru -1 of datephoto
            set ladate to text 1 thru 5 of DateOriginale
            set lannee to ladate
            set ladate to ladate & text 7 thru 8 of DateOriginale
            set lemois to text 7 thru 8 of DateOriginale
            set ladate to ladate & text 10 thru 11 of DateOriginale
            set lejour to text 10 thru 11 of DateOriginale
            set ladate to ladate & text 13 thru 14 of DateOriginale
            set lheure to text 13 thru 14 of DateOriginale
            set ladate to ladate & text 16 thru 17 of DateOriginale
            set lesminutes to text 16 thru 17 of DateOriginale
            set ladate to ladate & "." & text 19 thru 20 of DateOriginale
            set lessecondes to text 19 thru 20 of DateOriginale
            set newnom to lannee & "_" & lemois & "_" & lejour & "-" & lheure & "_" & lesminutes & "_" & lessecondes & "_" & nom
           
           
            set xxx to ladate as string
           
            if xxx is " 000000000000.00" then
                -- Ecrit un fichier erreur sur le bureau si erreur chargement date(=0000...)
                set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                write "Le fichier ne contient pas de date : " & chaque_fichier & return to lelog starting at eof
                close access lelog
            else
                do shell script "touch -t " & ladate & " " & quoted form of POSIX path of chaque_fichier
            end if
        end if
       
        set name of lefichier to newnom
    end repeat
   
end tell


tell application "Finder"
    set source to dossiertmp as alias
    set les_fichiers to files of source
end tell
set test1 to current date
set dernierdossier to ""

repeat with chaque_fichier in les_fichiers
    set lefichier to chaque_fichier as string
    set datephoto to do shell script exiftool_PATH & " -DateTimeOriginal " & quoted form of POSIX path of lefichier
    if datephoto is "" then set datephoto to do shell script exiftool_PATH & " -CreationDate " & quoted form of POSIX path of lefichier
    if datephoto is "" then set datephoto to do shell script exiftool_PATH & " -CreateDate " & quoted form of POSIX path of lefichier
   
   
    if length of datephoto > 20 then
        set x to (length of datephoto) - 33
        set DateOriginale to text -x thru -1 of datephoto
        set ladate to text 2 thru 5 of DateOriginale
        set lannee to ladate
        set ladate to ladate & text 7 thru 8 of DateOriginale
        set lemois to text 7 thru 8 of DateOriginale
        set ladate to ladate & text 10 thru 11 of DateOriginale
        set lejour to text 10 thru 11 of DateOriginale
        set ladate to ladate & text 13 thru 14 of DateOriginale
        set lheure to text 13 thru 14 of DateOriginale
        set ladate to ladate & text 16 thru 17 of DateOriginale
        set lesminutes to text 16 thru 17 of DateOriginale
        set ladate to ladate & "." & text 19 thru 20 of DateOriginale
        set lessecondes to text 19 thru 20 of DateOriginale
        set ladate to ladate as string
    end if
   
    set datetest to date (lejour & "/" & lemois & "/" & lannee & " " & lheure & ":" & lesminutes & ":" & lessecondes)
    set dif to datetest - test1
   
    tell application "Finder"
        if dif < 1200 then
            set lenom to lannee & "-" & lemois & "-" & lejour
            set dossierdest to ((dest as string) & lenom)
            if dernierdossier is not "" then
                set dossierdest to dernierdossier
            end if
            if not (exists folder dossierdest) then
                make new folder at dest with properties {name:lenom}
            end if
            move lefichier to dossierdest
            set dernierdossier to dossierdest
        else
            set lenom to lannee & "-" & lemois & "-" & lejour
            set dossierdest to ((dest as string) & lenom)
            set numero to 1
            set newnom to lenom
            repeat
                if exists dossierdest then
                    set newnom to lenom & "_" & numero
                    set dossierdest to ((dest as string) & newnom)
                    set numero to numero + 1
                else
                    set lenom to newnom
                    exit repeat
                end if
            end repeat
            make new folder at dest with properties {name:lenom}
            move lefichier to dossierdest
            set dernierdossier to dossierdest
        end if
       
    end tell
    set test1 to datetest
end repeat


tell application "Finder"
    delete dossiertmp
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
Dernière édition:
J'ai testé ce script il fonctionne bien. N'aurais-tu pas un dossier dudit nom avec un .tmp qui t'aiderait sur le bureau ? si c'est le cas met le à la poubelle
 
Bonjour,
@BellO666

L'erreur que tu donnes voudrait dire qu"au moment d'enregistrer le fichier avec son nouveau nom il trouve déjà un fichier avec ce nom.

Pour ça je pense que dans le dossier source tu as des sous-dossiers qui contiennent des doubles d'un fichier de 1er niveau.

Ma question dans le dossier source as-tu des fichiers ET des dossiers ?

Sinon précise ce que contiennent exactement les dossiers

Edit:
Curieux je viens de faire plusieurs tests et même avec des doubles je n'arrive pas à reproduire ton erreur. De plus le script ne travaille que sur les fichiers de premier niveau, pas dans les sous-dossiers !!!

De plus en relisant ton message, le script que tu as choisi ne fait pas exactement ce que tu souhaite obtenir.
Il crée dans le dossier de destination autant de dossiers que de dates trouvées avec dedans les photos correspondant à cette date, avec ajout devant le nom existant de YYYY_MM_JJ.

En conclusion je pense que tu n'as pas télécharger le bon script pour faire ce que tu désires ! explique ton besoin clairement afin de trouver le script qui correspond ...
 
Dernière édition:
Bonsoir,
J'ai pris un peu de temps pour modifier le script qui maintenant renomme selon ta demande soit:
YYYY_MM_JJ-HH_MN_SS-ancien nom.ext

Attention ce script modifie les fichiers originaux du dossier choisi ainsi que tous ses sous-dossiers.
Donc je te conseille de faire une copie du dossier contenant les fichiers et de travailler sur cette copie.

Si le script rencontre un fichier qui ne possède pas de date exif d'origine, il crée sur le bureau un fichier erreurs.txt qui te donne les fichiers concernés, sans les traiter.

voilà donc le nouveau script...
J'attends ton retour !

Bloc de code:
-- remplace date du fichier par la date exif creation et renomme les fichiers avec la date de création YYYY_MM_JJ-HH_MN_SS-ancien nom.ext

tell application "Finder"
    set Chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à redater"
    my inspecter(Chemin)
end tell

on inspecter(un_dossier)
    tell application "Finder"
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
            -- traitement d'un fichier
            
            set lefichier to chaque_fichier
            set AppleScript's text item delimiters to {""}
            set nom to name of chaque_fichier --récupère le nom du fichier
            set extens to document file nom in un_dossier --recupere l extension du fichier
            set lextension to name extension of extens
            set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
            set AppleScript's text item delimiters to {"."} --récupère la partie avant le dernier "."
            set elements to text items of nom
            set nomcourt to (items 1 thru -2 of elements) as string
            set ancien_nom to nomcourt
            set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
            
            set chaque_fichier to chaque_fichier as string
            
            try
                set datephoto to do shell script "/usr/local/bin/exiftool -DateTimeOriginal " & quoted form of POSIX path of chaque_fichier
                if datephoto is "" then set datephoto to do shell script "/usr/local/bin/exiftool -CreationDate " & quoted form of POSIX path of chaque_fichier
                if datephoto is "" then set datephoto to do shell script "/usr/local/bin/exiftool -CreateDate " & quoted form of POSIX path of chaque_fichier
                
                
            on error
                -- Ecrit un fichier erreur sur le bureau si erreur chargement date
                set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                write "Le fichier ne contient pas de date  : " & chaque_fichier & return to lelog starting at eof
                close access lelog
                
                set datephoto to ""
            end try
            
            if length of datephoto > 20 then
                set x to (length of datephoto) - 33
                set DateOriginale to text -x thru -1 of datephoto
                set ladate to text 1 thru 5 of DateOriginale
                set lannee to ladate
                set ladate to ladate & text 7 thru 8 of DateOriginale
                set lemois to text 7 thru 8 of DateOriginale
                set ladate to ladate & text 10 thru 11 of DateOriginale
                set lejour to text 10 thru 11 of DateOriginale
                set ladate to ladate & text 13 thru 14 of DateOriginale
                set lheure to text 13 thru 14 of DateOriginale
                set ladate to ladate & text 16 thru 17 of DateOriginale
                set lesminutes to text 16 thru 17 of DateOriginale
                set ladate to ladate & "." & text 19 thru 20 of DateOriginale
                set lessecondes to text 19 thru 20 of DateOriginale
                set newnom to lannee & "_" & lemois & "_" & lejour & "-" & lheure & "_" & lesminutes & "_" & lessecondes & "-" & ancien_nom
                
                set xxx to ladate as string
                
                if xxx is " 000000000000.00" then
                    -- Ecrit un fichier erreur sur le bureau si erreur chargement date(=0000...)
                    set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                    write "Le fichier ne contient pas de date : " & chaque_fichier & return to lelog starting at eof
                    close access lelog
                else
                    do shell script "touch -t " & ladate & " " & quoted form of POSIX path of chaque_fichier
                end if
            end if
            
            if datephoto is not "" then
                
                set aa to container of lefichier as string
                set numero to 1
                set lenewnom to newnom
                repeat
                    if exists aa & lenewnom & "." & lextension then
                        set lenewnom to newnom & "(" & numero & ")"
                        set numero to numero + 1
                    else
                        set newnom to lenewnom
                        exit repeat
                    end if
                end repeat
                set name of lefichier to newnom & "." & lextension
            else
                set lelog to open for access ((path to desktop folder as text) & "les erreurs.txt") as text with write permission
                write "Le fichier ne contient pas de date  : " & chaque_fichier & return to lelog starting at eof
                close access lelog
            end if
            
        end repeat
        
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
    
end inspecter
tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
Bonjour, merci pour ce retour, tout est OK, en fait, j'avais QuickTime d'ouvert avec un fichier du groupe, je ne l'avais pas vu. Donc quand j'ai supprimé pour tester, il était présent, caché... quel idiot, merci pour ce retour, tout est OK, et d'ailleurs très bien car je n'ai pas besoin de deux dossiers origine, destination. Encore merci pour votre réaction ultra rapide, @zeltron54 très bon script, car j'ai essayé avec exifrenamer, il ne fonctionne pas, il n'a pas trouvé des dates alors quand ligne de cmd exiftool, je les ai trouvé. Maintenant, je vais faire ce script sur les 550Go téléchargés de iCloud, pour sauvegarder correctement. Bonne soirée
 
Dernière édition: