Perte des dates des photos

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
@MadameGeek
Merci pour le retour.
Si cela a pu te servir, je suis content pour toi.
 

pat_13

Membre junior
3 Novembre 2019
15
0
68
Bonjour et merci pour l'attention portée à nos petits soucis.
je désirerais un renommage de mes photos et vidéos basé sur la date de prise de vue genre 2020-11-08 204255 plus éventuellement une incrémentation complémentaire pour les photos de la même seconde. Les photos qui ne comportent pas de date de prise de vue ne seraient pas traitées.
j'ai fait un essai de renommage en utilisant quelques photos que j'ai transférées dans un dossier de test et j'ai utilisé le script de la ligne 108. Le message d'erreur suivant: error "La variable newnom n’est pas définie." number -2753 from "newnom"
merci d'avance pour l'aide.
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
Bonjour,
Pour analyser il me faudrait plus d'élément sur l'erreur que tu observes.
Lors de l'erreur, quelle ligne est surlignée dans le script et y a t'il un fichier "les erreurs.txt" qui s'est créé sur le bureau?
Autre question as-tu bien installé le logiciel "exiftool"

Edit: Exiftool à télécharger là : https://exiftool.org/
 
Dernière édition:

pat_13

Membre junior
3 Novembre 2019
15
0
68
Bonjour,
Pour analyser il me faudrait plus d'élément sur l'erreur que tu observes.
Lors de l'erreur, quelle ligne est surlignée dans le script et y a t'il un fichier "les erreurs.txt" qui s'est créé sur le bureau?
Autre question as-tu bien installé le logiciel "exiftool"

Edit: Exiftool à télécharger là : https://exiftool.org/
 

Fichiers joints

  • Capture d’écran 2020-11-12 à 16.30.59.png
    Capture d’écran 2020-11-12 à 16.30.59.png
    414,7 KB · Affichages: 51
  • Capture d’écran 2020-11-12 à 17.00.00.png
    Capture d’écran 2020-11-12 à 17.00.00.png
    387 KB · Affichages: 47

pat_13

Membre junior
3 Novembre 2019
15
0
68
Est-ce que ceci convient? à priori j'ai bien chargé exiftool. j'avais fait un premier essai avec le script du post 107 si je me souviens bien et cela avait fonctionné sauf que le nom de fichier n'avait pas été modifié et les dates exif l'avaient été
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
il semblerai que le fichier n'ai pas de date, ou une date dans un format qui ne m'est pas connu.

Pour résoudre ce problème, il faudrait trouver le ou les fichiers concernés pour analyser ce fichier.
Combien de fichiers, ton dossier test contient 'il. Si c'est pas trop, il faudrait les mettre un par un, pour trouver un coupable.

ensuite on pourra faire des tests sur ce fichier.
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
J' ai ajouté au script un test qui contrôle si la date est vide.
Dans ce cas il cré un fichier "erreurs.txt" sur le bureau avec le chemin du fichier concerné, et il continu le traitement des fichiers suivant.
Dis moi si cela focntionne chez toi.

Bloc de code:
-- remplace date du fichier par la date exif creation et renomme les fichiers avec la date de création

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
                
                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
 

pat_13

Membre junior
3 Novembre 2019
15
0
68
Rien à dire, si ce n'est chapeau et merci.
l'essai avec ce dernier script semble fonctionner: j'ai repris le dossier test que j'avais utilisé avec le script précédant qui n'avait pas fonctionné et cette fois-ci cela marche; les photos et vidéos avec date de prise de vue sont bien renommées.
je vais poursuivre mes manipulations et me permettrai de revenir si d'autres questions se posent
encore merci
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
content pour toi !
N'oublie pas de consulter le fichier "erreurs.txt" qui se crée sur le bureau...
 

pat_13

Membre junior
3 Novembre 2019
15
0
68
Re,
Effectivement, mon dossier de test comprenait 22 photos provenant de WhatsApp et WeChat donc sans dates de prise de vue et le fichier erreurs.txt du bureau comprend bien 22 lignes.
ne serait-ce pas trop demander si il est possible d'établir un script qui permettrait de vérifier les doublons de photos non pas avec le titre mais avec le contenu du fichier à savoir la photo ?
 
M

Membre supprimé 1129907

Invité
Non pas avec le nom final basé sur la date ?
Le contenu du fichier sera différent si la date est différente donc...

Sinon via le terminal, la commande suivante donne un nombre basé sur le contenu du fichier. Deux fichiers ayant un octet différent n'auront pas le même résultat.
Bloc de code:
cksum nom_du_fichier

Donc avec ceci (repertoire=le répertoire où se trouve tes fichiers), tu auras le résultat du cksum trié chaque fichier. Ce résultat étant trié :
Bloc de code:
cksum repertoire/* | sort

Une bonne base de test pour voir si cette méthode pourrait te convenir.
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
Bonjour,

En me basant sur la proposition de @ecatomb :coucou: voilà un script qui cherche les doubles dans le dossier choisi y compris ses sous dossiers et crée sur le bureau un fichier texte "double.txt " qui contient un double par ligne avec l'adresse des 2 fichiers concernés.

Bloc de code:
--recherche doubles dans un dossier y compris les sous dossier
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(Chemin)
    tell application "Finder"
        set Chemin to Chemin as string
        set repertoire to quoted form of POSIX path of Chemin as string
        set laliste to do shell script "cksum " & repertoire & "/* | sort"
        
        set nb to count paragraph of laliste
        repeat with i from 1 to nb - 1
            set x to paragraph i of laliste
            set xx to characters 1 thru 17 of x as string
            
            set y to paragraph (i + 1) of laliste
            set yy to characters 1 thru 17 of y as string
            
            if xx = yy then
                set lelog to open for access ((path to desktop folder as text) & "les doubles.txt") as text with write permission
                write "En double  : " & x & " avec " & y & return to lelog starting at eof
                close access lelog
            end if
            --creer un txt provisoire avec les fichiers cheké
            set aa to ASCII character 10
            set lelog to open for access ((path to desktop folder as text) & "prov.txt") as text with write permission
            write x & aa to lelog starting at eof
            close access lelog
            
        end repeat
        -- ecrit le dernier fichier du dossier
        set lelog to open for access ((path to desktop folder as text) & "prov.txt") as text with write permission
        write y & aa to lelog starting at eof
        close access lelog
        
        -- traitement des dossiers :
        set Chemin to Chemin as alias
        set les_dossiers to folders of Chemin
        repeat with chaque_dossier in les_dossiers
            my inspecter(chaque_dossier)
        end repeat
        
    end tell
end inspecter

-- faire le tri du fichier prov et tester
set Chemin to ((path to desktop folder as text) & "prov.txt") as string
set repertoire to quoted form of POSIX path of Chemin
set laliste to do shell script "sort " & repertoire


set nb to count paragraph of laliste
repeat with i from 1 to nb - 1
    set x to paragraph i of laliste
    set xx to characters 1 thru 17 of x as string
    
    set y to paragraph (i + 1) of laliste
    set yy to characters 1 thru 17 of y as string
    
    if xx = yy then
        set x to characters (offset of "/" in x) thru end of x as string
        set y to characters (offset of "/" in y) thru end of y as string
        set lelog to open for access ((path to desktop folder as text) & "les doubles.txt") as text with write permission
        write "DOUBLE  : " & x & " AVEC " & y & return to lelog starting at eof
        close access lelog
    end if
    
end repeat
set aeffacer to quoted form of POSIX path of ((path to desktop folder as text) & "prov.txt")
do shell script "rm " & aeffacer

tell application "Finder"
    
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
Correction d'un Bug (erreur si un dossier était vide ou n'avait qu'un seul fichier), désolé ! :bigtears:

Bloc de code:
--recherche doubles dans un dossier y compris les sous dossier
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(Chemin)
    tell application "Finder"
        set Chemin to Chemin as string
        set repertoire to quoted form of POSIX path of Chemin as string
        set laliste to do shell script "cksum " & repertoire & "/* | sort"
        
        set nb to count paragraph of laliste
        repeat with i from 1 to nb - 1
            set x to paragraph i of laliste
            set xx to characters 1 thru 17 of x as string
            
            set y to paragraph (i + 1) of laliste
            set yy to characters 1 thru 17 of y as string
            
            if xx = yy then
                set lelog to open for access ((path to desktop folder as text) & "les doubles.txt") as text with write permission
                write "En double  : " & x & " avec " & y & return to lelog starting at eof
                close access lelog
            end if
            --creer un txt provisoire avec les fichiers cheké
            set aa to ASCII character 10
            set lelog to open for access ((path to desktop folder as text) & "prov.txt") as text with write permission
            write x & aa to lelog starting at eof
            close access lelog
            
        end repeat
        -- ecrit le dernier fichier du dossier
        if nb > 1 then
            set lelog to open for access ((path to desktop folder as text) & "prov.txt") as text with write permission
            write y & aa to lelog starting at eof
            close access lelog
        end if
        -- traitement des dossiers :
        set Chemin to Chemin as alias
        set les_dossiers to folders of Chemin
        repeat with chaque_dossier in les_dossiers
            my inspecter(chaque_dossier)
        end repeat
        
    end tell
end inspecter

-- faire le tri du fichier prov et tester
set Chemin to ((path to desktop folder as text) & "prov.txt") as string
set repertoire to quoted form of POSIX path of Chemin
set laliste to do shell script "sort " & repertoire


set nb to count paragraph of laliste
repeat with i from 1 to nb - 1
    set x to paragraph i of laliste
    set xx to characters 1 thru 17 of x as string
    
    set y to paragraph (i + 1) of laliste
    set yy to characters 1 thru 17 of y as string
    
    if xx = yy then
        set x to characters (offset of "/" in x) thru end of x as string
        set y to characters (offset of "/" in y) thru end of y as string
        set lelog to open for access ((path to desktop folder as text) & "les doubles.txt") as text with write permission
        write "DOUBLE  : " & x & " AVEC " & y & return to lelog starting at eof
        close access lelog
    end if
    
end repeat
set aeffacer to quoted form of POSIX path of ((path to desktop folder as text) & "prov.txt")
do shell script "rm " & aeffacer

tell application "Finder"
    
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
Décidément, c'était pas ma journée, voilà, un autre bug de corrigé ...

Bloc de code:
--recherche doubles dans un dossier y compris les sous dossier
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(Chemin)
    tell application "Finder"
        set Chemin to Chemin as string
        set repertoire to quoted form of POSIX path of Chemin as string
        set laliste to do shell script "cksum " & repertoire & "/* | sort"
        
        set nb to count paragraph of laliste
        if nb = 1 then
            set x to paragraph 1 of laliste
            set xx to characters 1 thru 17 of x as string
            set aa to ASCII character 10
            set lelog to open for access ((path to desktop folder as text) & "prov.txt") as text with write permission
            write x & aa to lelog starting at eof
            close access lelog
        end if
        
        repeat with i from 1 to nb - 1
            set x to paragraph i of laliste
            set xx to characters 1 thru 17 of x as string
            
            set y to paragraph (i + 1) of laliste
            set yy to characters 1 thru 17 of y as string
            
            if xx = yy then
                set lelog to open for access ((path to desktop folder as text) & "les doubles.txt") as text with write permission
                write "En double  : " & x & " avec " & y & return to lelog starting at eof
                close access lelog
            end if
            --creer un txt provisoire avec les fichiers cheké
            set aa to ASCII character 10
            set lelog to open for access ((path to desktop folder as text) & "prov.txt") as text with write permission
            write x & aa to lelog starting at eof
            close access lelog
            
        end repeat
        -- ecrit le dernier fichier du dossier
        if nb > 1 then
            set lelog to open for access ((path to desktop folder as text) & "prov.txt") as text with write permission
            write y & aa to lelog starting at eof
            close access lelog
        end if
        -- traitement des dossiers :
        set Chemin to Chemin as alias
        set les_dossiers to folders of Chemin
        repeat with chaque_dossier in les_dossiers
            my inspecter(chaque_dossier)
        end repeat
        
    end tell
end inspecter

-- faire le tri du fichier prov et tester
set Chemin to ((path to desktop folder as text) & "prov.txt") as string
set repertoire to quoted form of POSIX path of Chemin
set laliste to do shell script "sort " & repertoire


set nb to count paragraph of laliste
repeat with i from 1 to nb - 1
    set x to paragraph i of laliste
    set xx to characters 1 thru 17 of x as string
    
    set y to paragraph (i + 1) of laliste
    set yy to characters 1 thru 17 of y as string
    
    if xx = yy then
        set x to characters (offset of "/" in x) thru end of x as string
        set y to characters (offset of "/" in y) thru end of y as string
        set lelog to open for access ((path to desktop folder as text) & "les doubles.txt") as text with write permission
        write "DOUBLE  : " & x & " AVEC " & y & return to lelog starting at eof
        close access lelog
    end if
    
end repeat
set aeffacer to quoted form of POSIX path of ((path to desktop folder as text) & "prov.txt")
do shell script "rm " & aeffacer

tell application "Finder"
    
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
Bonjour,
Je vous met une nouvelle version "Optimisée" de la recherche de double.
Si un modo peut supprimer les 3 versions précédentes ... merci :bigtears:
Bloc de code:
--recherche doubles dans un dossier y compris les sous dossier
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(Chemin)
    tell application "Finder"
        set Chemin to Chemin as string
        set repertoire to quoted form of POSIX path of Chemin as string
        set laliste to do shell script "cksum " & repertoire & "/* | sort"
        
        set nb to count paragraph of laliste
        repeat with i from 1 to nb
            set x to paragraph i of laliste
            --crée un fichier provisoire avec la list au format mac (CR+LF)
            set aa to ASCII character 10
            set lelog to open for access ((path to desktop folder as text) & "prov.txt") as text with write permission
            write x & aa to lelog starting at eof
            close access lelog
        end repeat
        
        -- traitement des dossiers :
        set Chemin to Chemin as alias
        set les_dossiers to folders of Chemin
        repeat with chaque_dossier in les_dossiers
            my inspecter(chaque_dossier)
        end repeat
        
    end tell
end inspecter

-- faire le tri du fichier prov et tester
set Chemin to ((path to desktop folder as text) & "prov.txt") as string
set repertoire to quoted form of POSIX path of Chemin
set laliste to do shell script "sort " & repertoire

set nb to count paragraph of laliste
repeat with i from 1 to nb - 1
    set x to paragraph i of laliste
    set xx to characters 1 thru 17 of x as string
    
    set y to paragraph (i + 1) of laliste
    set yy to characters 1 thru 17 of y as string
    
    if xx = yy then
        set x to characters (offset of "/" in x) thru end of x as string
        set y to characters (offset of "/" in y) thru end of y as string
        --cree le fichier double
        set lelog to open for access ((path to desktop folder as text) & "les doubles.txt") as text with write permission
        write "DOUBLE  : " & x & " AVEC " & y & return to lelog starting at eof
        close access lelog
    end if
    
end repeat
--efface le fichier provisoire
set aeffacer to quoted form of POSIX path of ((path to desktop folder as text) & "prov.txt")
do shell script "rm " & aeffacer

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 

pat_13

Membre junior
3 Novembre 2019
15
0
68
Voici, ci-dessous, une partie du rapport du fichier 'les doubles.txt'
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.38(169).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.38(43).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.38(210).jpeg AVEC /Users/pat//PHOTOS// 2018-02-06 16.33.38(70).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.40(30).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.40(65).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.40(33).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.40(79).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.38(12).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.38(40).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.38(131).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.38(170).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.38(121).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.38(20).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.40(35).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.40(81).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.38(26).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.38(79).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.40(14).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.40(71).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.38(167).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.38(50).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.38(205).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.38(49).jpeg
DOUBLE : /Users/pat/PHOTOS// 2018-02-06 16.33.38(171).jpeg AVEC /Users/pat/PHOTOS// 2018-02-06 16.33.38(64).jpeg

on voit qu'une partie des photos renommées avec une extension (pour les mêmes dates à la seconde près) se retrouvent dans ce rapport mais, justement l'extension ne fait-elle pas que les noms des photos ne sont plus les mêmes??
par ailleurs j'ai trouvé 2 photos 2015-03-15 13.36.05 et 2015-03-15 13.36.05(1) avec les mêmes dates exif qui n'apparaissent pas dans le rapport
 

zeltron54

Membre d’élite
29 Mars 2008
2 049
324
Lorraine
Bonsoir,

La recherche de double ne s'occupe pas du nom ni de la date.
Comme disait @ecatomb il fait un "cksum" en gros, la somme des octets qui compose le fichier, si cette somme est la même il déclare les fichiers comme doubles.
Donc il suffit d'avoir modifié ne serait-ce qu'un seul octet pour qu'il soit différent.