IPB

Bienvenue invité ( Connexion | Inscription )

2 Pages V   1 2 >  
Reply to this topicStart new topic
> [Aide] Applescript pour renommer des dossiers photos
Options
Hagrid
posté 21 Mar 2015, 16:37
Message #1


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Bonjour à tous,

Je sollicite votre aide, car je m’arrache les cheveux depuis 2 jours pour essayer de faire un Applescript, mais je dois avouer que j’ai atteint mes limites (qui ne sont pas bien hautes…).

voilà l’histoire,

Je télécharge mes photos de mon appareil en WiFi dans un répertoire « a convertir » je passe un coup de moulinette avec exiftool pour mettre en forme mes dossiers et le nommage de mes fichiers. Le but c'est de permettre à ma femme ou mes enfants (et moi aussi smile.gif ) de decharger l'appareil photo mais surtout que les photos soient sauvegarder automatiquement sur le NAS quitte à faire le tri après.

ça me donne :

/2014/02/
-> 02-02-2015-155323.jpg
-> 05-02-2015-162223.jpg

/2014/05/
-> 01-05-2015-183523.jpg
-> 25-05-2015-232228.jpg

/2015/03/
-> 03-03-2015-155323.jpg

/2015/05/
-> 27-05-2015-222238.jpg

1) mon idée de départ est de renommer mon dossier « mois » en « 02 - Février 201x » en fonction
de l’année et du mois bien sur.

2) de renommer l’année « 2014 » en « Année 2014 » ainsi de suite.

3) de déplacer le tout sur mon NAS Synology (tous mes dossiers sont déjà configurés comme ça)
mais en faisant attention de ne pas écraser un fichier si il y a doublon (je ne sais pas si c’est par défaut lors d’une copie). Je voudrais déplacer mes fichiers et non les copier (mon Mac n’a que 256 Go de SSD et je ne garde aucune photo dessus).

J'ai bien essayé de bricoler 2 ou 3 trucs mais sans succès.
Par avance merci pour le coup de main car je n’ai plus de cheveux sur la tête
Go to the top of the page
 
+Quote Post
benja
posté 21 Mar 2015, 18:44
Message #2


Thalès du pavé
*****

Groupe : Membres
Messages : 2 520
Inscrit : 30 Jul 2004
Membre no 21 573



Je voulais juste te donner des pistes, au final j'ai écrit un script complet. il y a des dizaines de façons de traiter le problème, voici la mienne. Je n'ai pas traité la partie copie sur le NAS. J'éspère que le nom des variables n'est pas trop confus et que le script est compréhensible. Si tu ne comprend pas l'une ou l'autre des techniques utilisées, n'hésite pas à demander. L'idée c'est quand même que tu apprennes quelque chose.

Code
set liste_des_mois to {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"}

-- Choisir un dossier à trier

set dossier_a_trier to choose folder

tell application "Finder"
    
    -- Récupérer le contenu du dossier et en reconnaitre les sous-dossiers
    -- La variable contenu_du_dossier est une liste dont chaque élément sera traité l'un après l'autre dans une boucle repeat, la variable i est incrémentée à chaque fois que la boucle se répète
    
    set contenu_du_dossier to (every item in dossier_a_trier)
    repeat with i from 1 to (count of contenu_du_dossier)
        
        -- on récupère les propriétés de l'élément i dans la liste contenu_du_dossier, l'une de ces propriétés nommée "class" détermine le type d'élément (folder, document file...)
        
        set proprietes_de_l_element_i to properties of (item i of contenu_du_dossier)
        
        -- si l'élément en question est un dossier, on le traite
        
        if class of proprietes_de_l_element_i is folder then
            
            -- on récupère son nom
            
            set nom_de_l_element_i to name of (item i of contenu_du_dossier)
            try
                
                -- si le nom du dossier n'est pas un nombre, (nom_de_l_element_i as integer) échouera et causera une erreur auquel cas le programme sautera jusqu'à la fin du bloc try, le dossier n'est pas traité et on passe au suivant dans la liste
                
                if (nom_de_l_element_i as integer) is greater than 2000 then
                    
                    -- si le nom du dossier est un nombre supérieur à 2000, on élabore son nouveau nom, le & permet de concaténer des suites de caractères
                    
                    set nouveau_nom_du_dossier to "Année " & (nom_de_l_element_i as string)
                    
                    -- puis on effectue la même chose sur les sous-dossiers
                    
                    set contenu_du_sous_dossier_i to every item in (item i of contenu_du_dossier)
                    repeat with j from 1 to (count of contenu_du_sous_dossier_i)
                        set proprietes_de_l_element_j to properties of (item j of contenu_du_sous_dossier_i)
                        if class of proprietes_de_l_element_j is folder then
                            set nom_de_l_element_j to name of (item j of contenu_du_sous_dossier_i)
                            try
                                
                                -- ici le nom du sous-dossier doit être un nombre entre 1 et 12
                                
                                if (nom_de_l_element_j as integer) > 0 and (nom_de_l_element_j as integer) < 13 then
                                    
                                    -- on récupère le nom du mois correspondant au nombre pour élaborer le nouveau nom de sous-dossier, puis on renomme le sous-dossier
                                    
                                    set nom_du_mois to item (nom_de_l_element_j as integer) of liste_des_mois
                                    set nouveau_nom_du_sous_dossier to (nom_de_l_element_j as string) & " - " & nom_du_mois & " " & nom_de_l_element_i
                                    set name of item j of contenu_du_sous_dossier_i to nouveau_nom_du_sous_dossier
                                end if
                            end try
                        end if
                    end repeat
                    
                    -- On ne modifie le nom du dossier parent qu'après celui des sous-dossiers car sinon le changement de nom nous fait perdre la référence au dossier parent
                    
                    set name of item i of contenu_du_dossier to nouveau_nom_du_dossier
                    
                end if
            end try
        end if
    end repeat
end tell


Ce message a été modifié par benja - 21 Mar 2015, 20:31.


--------------------
Ryzen 3600 / GTX1080Ti / 32GB / Win 10 (Le nouveau mac pro quoi)
Go to the top of the page
 
+Quote Post
Hagrid
posté 22 Mar 2015, 09:34
Message #3


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Heu comment dire... whaouuuuuuuuuu

Merci énormément, ça marche du premier coup je te dis un énorme merci.

Je vais essayer la partie NAS et peut être aussi un petit wakeOnlan si le NAS est éteint. (j'ai déjà le script pour monter le volume uniquement si le NAS est ON)

Merci encore (alors là il m'épate, il m'épate, mais il m'épate...)
Go to the top of the page
 
+Quote Post
Hagrid
posté 22 Mar 2015, 16:40
Message #4


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Bon j'ai essayé de déplacer mes dossiers "/Photos a sauvegarder/" (avec Année 2014, Année 2015...) dans "/Photos a sauvegarder/Test NAS" mais je m'embrouille avec les commandes. Je ne sais pas si je dois utiliser "duplicate folder" ou "move" ou do shell script "/bin/cp ". J'ai essayé plein de truc que j'ai trouvé à gauche et à droite mais je n'avance à rien, il y a toujours quelque chose qui bloque. En fait je n'y comprends pas grand chose.


Si je peux te demander encore un peu d'aide pour pouvoir déplacer mes dossiers avec mes photos vers mon répertoire NAS en faisant attention qu'il n'écrase pas les doublons et que le script efface le dossier de départ une fois l'export réaliser avec succès. Et j'arrete d'abuser smile.gif

si il y a une chose que j'ai bien comprise depuis 2 jours c'est que les scripts c'est pas pour moi sad.gifsmile.gif

par avance merci

Go to the top of the page
 
+Quote Post
benja
posté 22 Mar 2015, 17:01
Message #5


Thalès du pavé
*****

Groupe : Membres
Messages : 2 520
Inscrit : 30 Jul 2004
Membre no 21 573



Ce coup ci je ne t'écris pas tout. Voici plutôt un extrait que j'ai retrouvé d'un de mes scripts (à adapter à ton usage, ce serait trop facile sinon). Ce script récupère la liste de fichiers se trouvant dans le dossier "Téléchargements", crée une liste de tous les fichiers portant l'extension ".mp4" puis les copie dans un autre dossier et enfin supprime les originaux et vide la corbeille (pendant tes tests je te conseille de commenter (ajouter "-- " devant) la ligne qui supprime les fichiers jusqu'à ce que ton script soit fonctionnel pour éviter les bourdes). En cas de doublon, tu auras le dialogue habituel du Finder te demandant quoi faire. Si tu veux éviter le dialogue, il faudra procéder avec un shell script (plus ardu mais terriblement plus rapide et puissant).

Une des erreurs que je commet fréquemment est que toutes les commandes qui ont attrait à la manipulation de fichiers (lister les fichiers dans un dossier, en extraire les propriétés, déplacer ou supprimer des fichiers) doivent être dans un bloc "tell application "Finder"" sinon tu auras des erreurs.

Code
tell application "Finder"
    
    -- on crée une liste vide
    
    set mp4FilesList to {}
    
    -- chaque fichier terminant par .mp4 est ajouté à la fin de cette liste
    
    set downloadFolderItems to every file of folder (path to downloads folder)
    repeat with i from 1 to count of downloadFolderItems
        if name of item i of downloadFolderItems ends with ".mp4" then copy item i of downloadFolderItems to the end of mp4FilesList
    end repeat
    
    -- enfin tous les éléments de la liste sont copiés puis les originaux supprimés
    
    move every item of mp4FilesList to "RAID6TO:A Trier:MP4:"
    delete every item of mp4FilesList
    empty the trash
end tell

Citation
si il y a une chose que j'ai bien comprise depuis 2 jours c'est que les scripts c'est pas pour moi

Ne désespère pas, je suis passé par là aussi. Il faut commencer par des scripts simples et surtout ne pas hésiter à taper des bouts de ton script dans une feuille vierge pour les tester et analyser le contenu et l'évolution des variables en plaçant ici ou là un "return variable" (qui stoppera l'exécution du script et te renverra le contenu de la variable) ou "log variable" (qui affichera le contenu de la variable dans le log onglet "Messages", voir plus bas pour afficher le log). Les problèmes les plus fréquents viennent de la difficulté à comprendre le type de variable renvoyé par chaque commande et le type de variable accepté par chaque commande. Fais des scripts de test pour comprendre la syntaxe et le fonctionnement de telle ou telle technique puis construit de petits blocs fonctionnels que tu intégreras ensuite dans ton script final.

N'hésite pas à lire aussi des tutos simples sur les boucles et l'usage des différents types de variables (bien sur pour ça la lecture de l'anglais est un plus, le nombre de tutos en anglais étant bien plus important). Rechercher sur Google en anglais peut aussi aider, il existe d'innombrables exemples pour chaque usage à adapter sur stackexchange ou macscripter (chercher par exemple "applescript move multiple folders").

Quand tu seras plus à l'aise, apprend à écrire des routines. Cela te permettra de simplifier grandement l'écriture et la lecture de tes scripts et de réutiliser facilement des fonctions de tes autres scripts.

Enfin, apprends à lire les dictionnaires des applications ainsi que la documentation d'Apple. Ca peut paraitre du charabia au début, mais à l'usage ça deviendra tes meilleures sources d'information.

A noter aussi que le petit bouton de droite dans la barre tout en bas (celui qui ressemble à un document) te permet d'afficher les logs et d'analyser ce qui se passe, très utile mais peut cependant ralentir l'exécution sur des scripts complexes.

Ce message a été modifié par benja - 22 Mar 2015, 18:29.


--------------------
Ryzen 3600 / GTX1080Ti / 32GB / Win 10 (Le nouveau mac pro quoi)
Go to the top of the page
 
+Quote Post
Hagrid
posté 22 Mar 2015, 18:43
Message #6


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Merci pour le temps que tu m'accordes, j'ai lu beaucoup d'exemples de script (notamment sur macscripter) que j'ai essayé d'appliquer dans des fenêtres vides, mais je crois que je m'attaque a un bien gros morceau pour commencer... Sinon je ne travaille que sur des dossiers "test"

J’ai repris ton script pour MP4 pour l'appliquer au mien, par contre je crois que je dois chercher du côté des boucles, car il ne "surveille" que le dossier "download" alors que de mon côté j'ai des sous-dossiers. Donc il faut bien qu'il "fouille" séquentiellement ? Je chauffe ?

Dernière petite question peut-on donner plusieurs types de fichiers dans la commande if name of item i of downloadFolderItems ends with {".JPG", ".jpg", ".MP4", ".AVI"} ou quelque chose comme ça, car cela aurait été trop simple

C’est passionnant, mais c'est pas simple quand même.

@+
Go to the top of the page
 
+Quote Post
benja
posté 22 Mar 2015, 19:31
Message #7


Thalès du pavé
*****

Groupe : Membres
Messages : 2 520
Inscrit : 30 Jul 2004
Membre no 21 573



Tu peux combiner plusieurs conditions avec les opérateurs logiques and, or, etc... Par exemple :

Code
if (condition 1) and (condition 2) then

Dans ce cas les deux conditions doivent être vraies, ou alors :

Code
if (condition 1) or (condition 2) then

Dans ce cas il suffit qu'une seule des conditions soit vraie.

C'est d'ailleurs ce que l'on fait dans le premier script lorsqu'on vérifie que le nom du dossier est compris entre 1 et 12 :

Code
if (nom_de_l_element_j as integer) > 0 and (nom_de_l_element_j as integer) < 13 then

On peut aussi comparer l'extension à une liste (la solution que j'utilise dans ce cas car la liste peut être modifiée en un clin d'œil au besoin) par exemple :

Code
set liste_extensions to {"jpg", "png"}
repeat with i from 1 to count of downloadFolderItems
    if name extension of item i of downloadFolderItems is in liste_extensions then copy item i of downloadFolderItems to the end of imageFilesList
end repeat

Edit : A noter que j'ai fait une erreur dans celui-ci, impossible de récupérer "name extension of" ou de faire une copie en dehors d'un bloc "tell application "Finder"".

Il existe différentes manières pour obtenir l'information que tu souhaites vérifier (ici l'extension du fichier). Pour ma part lorsque j'explore les voies pour obtenir cette information j'utilise quelque chose comme ça :

Code
set the_file to choose file
if name extension of the_file is "jpg" then beep

Si le mac bippe quand je sélectionne un jpeg (et ne bippe pas quand je sélectionne autre chose bien sur), bingo, je peux utiliser ce bout de code dans mon script.

Ou encore :

Code
set the_file to choose file
tell application "Finder" to return properties of the_file

Très utile pour explorer les données utilisables.

La difficulté dans ton cas c'est que tu souhaites faire une sorte de sauvegarde incrémentale avec une arborescence de dossiers, tandis que mon script ne travaille que dans un seul dossier. Cela veut dire que ton script va devoir parcourir chaque sous-dossier de la source sous deux niveaux (tout comme dans notre premier script), vérifier si chacun de ces sous-dossiers existe dans la cible. Ensuite si le dossier cible n'existe pas il faudra le créer avec le bon nom. Enfin une fois qu'on est sur que le dossier existe il faut copier tous les fichiers du sous-dossier source vers le sous-dossier cible. Tu peux te baser sur quelque chose comme ça :

Code
-- Choisir un dossier source et un dossier cible

set dossier_source to choose folder
set dossier_cible to choose folder

tell application "Finder"
    set contenu_du_dossier to (every item in dossier_source)
    repeat with i from 1 to (count of contenu_du_dossier)
        set proprietes_de_l_element_i to properties of (item i of contenu_du_dossier)
        if class of proprietes_de_l_element_i is folder then
            set nom_de_l_element_i to name of (item i of contenu_du_dossier)
            if folder nom_de_l_element_i of dossier_cible exists then
                -- choses à faire si le dossier existe
            else
                -- chose à faire si le dossier n'existe pas
                -- par exemple make new folder with properties {name:nom_de_l_element_i}
            end if
        end if
    end repeat
end tell

Aussi, j'ai trouvé la commande qui permet de copier sans écraser :

Code
tell application "Finder"
    move les_fichiers to la_destination without replacing
end tell


Bon scriptage wink.gif

Ce message a été modifié par benja - 23 Mar 2015, 00:09.


--------------------
Ryzen 3600 / GTX1080Ti / 32GB / Win 10 (Le nouveau mac pro quoi)
Go to the top of the page
 
+Quote Post
Hagrid
posté 22 Mar 2015, 19:38
Message #8


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Ca paraît tellement évident quand tu l'expliques, moi j'étais parti sur

property extension : {".jpg", ".jpeg", ".JPG", ".MP4"}

if name of item i of downloadFolderItems ends with extension then copy

mais c'était trop simple.........


je t'embête plus pour aujourd'hui, je suis épuisé tongue.gifsmile.gif
Go to the top of the page
 
+Quote Post
benja
posté 22 Mar 2015, 19:45
Message #9


Thalès du pavé
*****

Groupe : Membres
Messages : 2 520
Inscrit : 30 Jul 2004
Membre no 21 573



Ah bin t'étais pas loin d'une solution élégante en plus.


--------------------
Ryzen 3600 / GTX1080Ti / 32GB / Win 10 (Le nouveau mac pro quoi)
Go to the top of the page
 
+Quote Post
Hagrid
posté 22 Mar 2015, 19:48
Message #10


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



flatteur biggrin.gif
Go to the top of the page
 
+Quote Post
Hagrid
posté 23 Mar 2015, 22:49
Message #11


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Salut benja,

je suis en train de me battre avec mon script et plus je cherche moins je trouve ça simple :

par exemple comment dire au script que je veux descendre dans l'arborescence (folders of folder), je trouve des exemples, mais souvent des messages d'erreurs, des fois il remonte l'arborescence, des fois il fait rien

Je nage, je nage...

dans ton exemple je me suis dit :

je vais recopier ton script pour faire le premier niveau de l'arborescence puis je mettrai le même script à la suite pour lui dire de refaire le chemin, mais en rentrant d'un niveau dans les dossiers... et bah non

Code
set dossier_source to choose folder
set dossier_cible to choose folder

tell application "Finder"  

set contenu_du_dossier to (every folder of dossier_source)  
repeat with i from 1 to (count of contenu_du_dossier)

set proprietes_de_l_element_i to properties of (item i of contenu_du_dossier)  

if class of proprietes_de_l_element_i is folder then    
set nom_de_l_element_i to name of (item i of contenu_du_dossier)

if folder nom_de_l_element_i of dossier_cible exists then

beep

else    
make new folder of dossier_cible with properties {name:nom_de_l_element_i}

end if  
end if
end repeat
end tell

beep
beep

tell application "Finder"  
set contenu_du_dossier to dossier_source  
set contenu_du_sous_dossier to every folder of contenu_du_dossier
repeat with i from 1 to (count of contenu_du_sous_dossier)

set proprietes_de_l_element_i to properties of (item i of contenu_du_sous_dossier)  
if class of proprietes_de_l_element_i is folder then    
set nom_de_l_element_i to name of (item i of contenu_du_sous_dossier)

if folder nom_de_l_element_i of dossier_cible exists then    

beep

else    

make new folder of contenu_du_sous_dossier with properties {name:nom_de_l_element_i}

end if  
end if  
end repeat
end tell

Je me suis dit, peut être que l'on peut attaquer le script de manière "horizontale" : je regarde dans le dossier source et je recrée le dossier destination au fur et à mesure : Source > Année 2014 > 02 > xxxx.jpg Destination > Année 2014 > 02 > xxxx.jpg, mais alors là c'est le festival avec les else, les end, les if...

pourrais-tu m'aiguiller encore un peu ?

par avance merci tongue.gif

Ce message a été modifié par Hagrid - 24 Mar 2015, 08:02.
Go to the top of the page
 
+Quote Post
benja
posté 24 Mar 2015, 02:19
Message #12


Thalès du pavé
*****

Groupe : Membres
Messages : 2 520
Inscrit : 30 Jul 2004
Membre no 21 573



Si tu regardes bien, dans la première partie tu as écrit ceci :

Code
tell application "Finder"
    set contenu_du_dossier to (every folder of dossier_source)
    repeat with i from 1 to (count of contenu_du_dossier)

Puis dans la deuxième partie ceci :

Code
tell application "Finder"
    set contenu_du_dossier to dossier_source
    set contenu_du_sous_dossier to every folder of contenu_du_dossier
    repeat with i from 1 to (count of contenu_du_sous_dossier)

Or ces deux passages font exactement la même chose. La deuxième ligne ici est inutile, elle ne fait que dupliquer une variable. Utiliser l'une ou l'autre reviendra au même résultat.

Citation
comment dire au script que je veux descendre dans l'arborescence (folders of folder)

Ah là je suis d'accord avec toi, naviguer dans l'arborescence en AppleScript est une galère. Entre les type alias, file, folder, POSIX path et autres on est vite largués. J'essaie de me contenter de quelques techniques que j'ai repéré et qui marchent. Par exemple "choose folder" renvoie un type alias. Si je connais le nom de l'élément que je cherche dans ce dossier (en type string), j'utilise ceci :

Code
set the_folder to choose folder
tell application "Finder" to get (item "Mon fichier" of the_folder)

Si je connais son index (son n° dans la liste, type integer) :

Code
tell application "Finder" to get (item 3 of the_folder)

Bien sur ceci fonctionne :

Code
set nom_du_fichier to "Mon fichier"
tell application "Finder" to get (item nom_du_fichier of the_folder)
set index_du_fichier to 3
tell application "Finder" to get (item index_du_fichier of the_folder)

Ca devient plus intéressant avec des boucles et un compteur :

Code
set the_folder to choose folder
set the_folder to every item of the_folder
-- indispensable sinon (count of the_folder) renvoie 1
repeat with i from 1 to (count of the_folder)
    tell application "Finder" to get (item i of the_folder)
end repeat

Maintenant si je veux un sous dossier :

Code
tell application "Finder to get item 2 of item 3 of the_folder
tell application "Finder to get item "Mars" of item "2013" of the_folder

Code
set the_folder to choose folder
-- the_folder est un alias
set folder_contents to every item of the_folder
-- folder_contents est {"une", "liste", "d'alias"}
repeat with i from 1 to (count of folder_contents)
    set le_dossier to (item i of folder_contents)
    -- le_dossier est un alias
    set contenu_du_dossier to every item of le_dossier
    -- contenu_du_dossier est {"une", "liste", "d'alias"}
    repeat with j from 1 to (count of contenu_du_dossier)
        set le_sous_dossier to item j of item i of the_folder
        -- le_sous_dossier est un alias
    end repeat
end repeat

A mon avis le plus simple c'est que tu partes du premier script. Celui-ci parcourt déjà les dossiers et sous-dossiers. Pour cela il utilise une boucle dans une boucle. La première (qu'on va appeler la grande boucle) commence par ceci et se termine tout en bas du script :

Code
repeat with i from 1 to (count of contenu_du_dossier)

Elle parcourt un à un les éléments contenus dans le dossier racine à la recherche de dossiers dont le nom est un nombre supérieur à 2000 (les années donc). Lorsqu'elle a identifié l'un de ces dossiers, elle va lancer alors une autre boucle (la petite) qui commence par ceci :

Code
set contenu_du_sous_dossier_i to every item in (item i of contenu_du_dossier)
repeat with j from 1 to (count of contenu_du_sous_dossier_i)

Ici la grande boucle a identifié un dossier année, elle copie son contenu dans une liste puis lance la petite boucle qui va à son tour parcourir un par un tous les éléments de cette liste à la recherche de dossiers dont le nom est un chiffre entre 1 et 12 (les mois).

Une fois que la petite boucle a parcouru, identifié et renommé tous les éléments, elle se termine et rend la main à la grande boucle.

Code
                    end repeat
                    set name of item i of contenu_du_dossier to nouveau_nom_du_dossier
                end if
            end try
        end if
    end repeat

Le travail de la petite boucle étant terminé, la grande boucle peut maintenant renommer le dossier année qui vient d'être parcouru et passer au suivant.

Le cycle se répète, on passe au deuxième dossier, si c'est un dossier répondant aux critères des dossiers années, on lance la petite boucle sur son contenu qui identifie et renomme les dossiers mois, redonne la main, etc... jusqu'à avoir parcouru tout le contenu du dossier racine. La grande boucle se termine alors et le programme avec.

Partant de là tu as déjà toute la structure pour parcourir l'arborescence des fichiers. Le tout c'est de garder ce premier script en commencement pour que tes dossiers soient bien nommés, puis dupliquer ce même script et le coller à la suite, à la différence que cette deuxième partie ne va plus renommer les dossiers de la source mais vérifier leur existence sur la cible, créer les dossiers et sous-dossiers manquants et copier les fichiers. Tu n'as alors qu'à garder la structure et modifier le contenu des boucles en t'inspirant de ce que je t'ai écrit dans le message 7. Souviens toi, la grande boucle travaille sur les dossiers années, la petite sur les dossiers mois.

Bon courage smile.gif

P.S : Lorsque tu transmet du code sur le forum, tu peux le coller dans un bloc "code" (le petit bouton qui a une tête de script, AAAAH je vois des scripts partout !), ça garde toute la mise en page et les caractères invisibles et c'est plus pratique à récupérer.

Ce message a été modifié par benja - 24 Mar 2015, 15:23.


--------------------
Ryzen 3600 / GTX1080Ti / 32GB / Win 10 (Le nouveau mac pro quoi)
Go to the top of the page
 
+Quote Post
Hagrid
posté 24 Mar 2015, 20:03
Message #13


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Non mais... le mec qui a inventé l'applescrit c'était un psychopathe !
Go to the top of the page
 
+Quote Post
Hagrid
posté 25 Mar 2015, 08:42
Message #14


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Salut benja,

Bon j'avance tout doucement, j'ai essayé de reprendre ta démarche bloc par bloc pour bien comprendre le déroulement de la séance d'analyse des répertoires, par contre c'est quand je suis à peu près content de moi que j'ai des trucs sortis du royaume d'Ades...

pourrais-tu (encore une fois ) regarder mon script et me dire si je suis dans la bonne direction et surtout me dire pourquoi j'ai ce message d'erreur (je crois que c'est à cause du fichier invisible .DS_Store)

Merci pour ton aide.


Code
tell application "Finder"
    
    set Folder_Annee to (choose folder) as alias
    set the_folderD to (choose folder) as alias
    set Folder_Annee to every item of Folder_Annee
    set jpgFilesList to {}
    set extension to {".jpg", ".JPG", ".MP4"}
    
    repeat with i from 1 to (count of Folder_Annee)
        tell application "Finder" to get (item i of Folder_Annee)
        
        display dialog "Folder_Annee contient : " & (item i of Folder_Annee)
        
        
        set Folder_Mois to every item of (item i of Folder_Annee)
        
        repeat with j from 1 to (count of Folder_Mois)
            tell application "Finder" to get (item j of Folder_Mois)
            
            display dialog "Folder_Mois contient : " & (item j of Folder_Mois)
            
            set Folder_Photos to every file of (item i of Folder_Mois)
            
            repeat with k from 1 to (count of Folder_Photos)
                tell application "Finder" to get (item k of Folder_Photos)
                
                if name of item k of Folder_Photos ends with extension then copy (item k of Folder_Photos) to the end of jpgFilesList
                
                #display dialog "jpgFilesList contient : " & jpgFilesList
                
            end repeat
        end repeat
    end repeat
    
end tell
Go to the top of the page
 
+Quote Post
benja
posté 25 Mar 2015, 09:10
Message #15


Thalès du pavé
*****

Groupe : Membres
Messages : 2 520
Inscrit : 30 Jul 2004
Membre no 21 573



Ah je vois que tu essaies de tout réécrire toi même. J'aime bien, c'est l'esprit.

J'ai essayé ton script sur un de mes dossiers photos et je n'ai eu aucun message d'erreur, tout se passe comme prévu. Le script ne traitera pas les fichiers invisibles à moins qu'il y ait été expressément invité. Par contre si je peux me permettre une remarque, les lignes "tell application "Finder" to get..." ne font rien, le script fonctionne d'ailleurs sans. Je les utilise dans mes petits tests de deux lignes car "get variable" permet de renvoyer la variable en question comme résultat dans la fenêtre du bas et donc de visualiser son contenu.

Ce message a été modifié par benja - 25 Mar 2015, 09:17.


--------------------
Ryzen 3600 / GTX1080Ti / 32GB / Win 10 (Le nouveau mac pro quoi)
Go to the top of the page
 
+Quote Post
Hagrid
posté 25 Mar 2015, 09:22
Message #16


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



c'est bizarre j'avais une erreur mais je crois que je l'ai trouvée :

set Folder_Photos to every file of (item j of Folder_Mois)

j'avais mis "(item i of Folder_Mois)"

mais du coup ma jpgFilesList est vide !
Go to the top of the page
 
+Quote Post
benja
posté 25 Mar 2015, 09:35
Message #17


Thalès du pavé
*****

Groupe : Membres
Messages : 2 520
Inscrit : 30 Jul 2004
Membre no 21 573



Ah bin oui tiens, c'est une erreur que je fais souvent.

Concernant ta liste vide la condition "if name of item k of Folder_Photos ends with extension" est toujours fausse (car aucun de tes noms de fichiers ne se termine par {".jpg", ".JPG", ".MP4"}). Ca marcherait avec ends with ".jpg", mais pas avec une liste. Tu peux utiliser en revanche la propriété "name extension" qui renvoie uniquement l'extension d'un fichier sans le point, et utiliser la condition "if name extension of item k of Folder_Photos is in extension", qui fonctionne avec une liste. Bien sur il faudra aussi enlever les points devant les extensions dans ta liste de comparaison.

Ce message a été modifié par benja - 25 Mar 2015, 09:43.


--------------------
Ryzen 3600 / GTX1080Ti / 32GB / Win 10 (Le nouveau mac pro quoi)
Go to the top of the page
 
+Quote Post
Hagrid
posté 25 Mar 2015, 12:34
Message #18


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



bon j'arrive pas a afficher jpgFilesList, il ne me retourne rien dans

display dialog "jpgFilesList contient : " & jpgFilesList

autre petite question comment séparer mon "année 2005" de tout le reste

get folder "Année 2005" of folder "Photos a sauvegarder" of folder "Downloads" ...

afin de lui dire

make new folder at folder FOLDER_DESTINATION with properties {name:Mon_Annee}

car j'ai l'impression qu'il y a tout l'alias dans Mon_Annee et du coup il garde le chemin du FOLDER_SOURCE

heu je sais pas si je suis très clair là smile.gif
Go to the top of the page
 
+Quote Post
Hagrid
posté 25 Mar 2015, 13:01
Message #19


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



je crois que je chauffe smile.gif

set Mon_Annee to name of (item i of Folder_Annee) as text

c'est bon j'arrive à créer mon dossier Année dans le repertoire de destination

j'avance, j'avance smile.gif
Go to the top of the page
 
+Quote Post
PBell
posté 25 Mar 2015, 21:43
Message #20


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 264
Inscrit : 7 Dec 2013
Lieu : Ile de France
Membre no 188 169



Bonsoir Hagrid, Benja,
Je me permets d'intervenir dans vos échanges...fructueux !

Tout d'abord un petit commentaire tout simple : les noms du type "année yyyy mois mmmmm" n'apportent pas grand chose de plus qu'un simple yyyy-mm, mais sont bien plus délicats à traiter, surtout par un autre script si l'envie t'en prend un jour.
Et en plus, yyyy-mm se trie facilement dans une liste Finder, ce qui n'est pas le cas des mois en texte (Août est avant Février par ordre alphabétique).
Par ailleurs les accents dans les noms de dossiers/fichier (comme année) sont une habitude regrettable qui te vaudra un jour des problèmes en passant d'un système à l'autre : rien ne garantie la pérennité de Mac OS sur 30 ans, alors que tes photos de famille doivent sans doute toujours être visibles et triées dans 30 ou 40 ans !
Ceci n'est qu'un avis basé sur des années de pratique, mais ton choix étant "Année yyyy mois mmmmm, le script doit le faire ... donc faisons le !


Le script de Benja peut être amélioré, d'une part en traitant les éléments du dossier dès la création de la liste en filtrant les folders ce qui évite les tests de class (folder ou pas), d'autre part en passant par les boucles de liste (et non d'indice)
Voici un exemple pratiquement copié à partir de celui de Benja mais avec les améliorations :
CODE
set liste_des_mois to {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"}

set dossier_a_trier to choose folder -- sélection du dossier à trier

tell application "Finder"
    -- traitement des sous dossiers du dossier à trier
    set Sous_Dossiers to every folder of dossier_a_trier
    repeat with Un_Dossier in Sous_Dossiers
        try
            set Annee to (name of Un_Dossier) as integer
        on error
            set Annee to 0
        end try
        if Annee is greater than 2000 then -- c'est un dossier Année on le traite
            set Dossiers_Mois to every folder of Un_Dossier
            repeat with un_Mois in Dossiers_Mois -- boucle sur les sous-dossiers, sans passer par un indice
                try
                    set Num to (name of un_Mois) as integer
                    if Num is in {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} then
                        set name of un_Mois to name of un_Mois & "-" & (item Num of liste_des_mois) & " Année " & (name of Un_Dossier)
                    end if
                end try
            end repeat
            set name of Un_Dossier to "Année " & name of Un_Dossier --changement du nom du dossier année
        end if
    end repeat
    
    set A_copier to every item of dossier_a_trier --     copie de tous les fichiers , dossiers et sous dossiers
    -- set Destination to nom du dossier du NAS
    -- duplicate A_copier to Destination
    -- delete A
end tell

La logique est la même que Benja, mais le code un peu plus concis.

Par ailleurs, la sélection automatique des fichiers ayant une certaine extension dans un dossier peut se faire très simplement comme suit :
CODE
set dossier_a_trier to choose folder -- sélection du dossier à trier
tell application "Finder"
    set Mes_Images to every item of dossier_a_trier whose name extension is in {"JPG", "jpg", "jpeg"}
end tell


Le résultat est une variable de liste Mes_Images qui peut être utilisée directement en copie, move ou delete....comme dans le script précédent où la variable A_Copier contient la liste de tous les éléments, dossier, images, sous dossiers,... du dossier_a_trier.

J'espère que ma modeste contribution vous aidera pour un script plus concis.

Cordialement


--------------------
iiMac 24 M1 16Go/1To 13.5.1
iMac 27 i5 3,1GHz 8Go/1To 10.11.6 / 10.6.8
iMac 20 C.Duo 2,6Ghz 8Go/350Go 10.6.8 / 10.11
Mini C.Duo 2,0Ghz 2Go/500Go 10.6.8
Go to the top of the page
 
+Quote Post
Hagrid
posté 26 Mar 2015, 10:52
Message #21


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Bonjour PBell et merci de t'intéresser aussi à mon problème,

pour les noms des fichiers je ne suis pas trop inquiet, je pense (à mon humble avis) que l'on se dirige vers l'utilisation générale des métadonnées un peu partout, et de toute façon dans 40 ans c'est pas moi qui m'y collerai laugh.gif

ton script fonctionne très bien

Par contre je me suis dit que c'était plus simple de laisser le script copier tous les "items" sans tenir compte des extensions, je pense aux fichiers RAW ou Vidéos, c'est parfait comme ça (j'étais parti sur ce système à cause de ces saletés de fichiers .DS_Store, ça me mettait le bin's)

j'ai changé

Code
set A_copier to item folder of dossier_a_trier


par

Code
set A_copier to every folder of dossier_a_trier


Sinon ça ne fonctionnait pas avec un vilain message d'erreur.

dernière chose, comment faire pour dupliquer les fichiers, MAIS renommer s’il trouve un doublon (PB des prises de vue en rafale ou import d'un appareil photo avec la même date et la même heure à la seconde près biggrin.gif ) par exemple : 2013_06_02_114816.JPG en 2013_06_02_114816-1.JPG

en tout cas merci a vous deux pour m'avoir aidé, je crois que je vais descendre de niveau pour recommencer plus simplement par le début

amicalement

Ce message a été modifié par Hagrid - 26 Mar 2015, 11:46.
Go to the top of the page
 
+Quote Post
PBell
posté 26 Mar 2015, 19:19
Message #22


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 264
Inscrit : 7 Dec 2013
Lieu : Ile de France
Membre no 188 169



Bonsoir Hagrid,
Dans le cas ou la liste de fichiers à copier risque de trouver, sur le dossier de destination, un fichier pré-existant de même nom, je ne connais pas d'autre solution que de faire une boucle sur les fichiers à copier (every item !) et, pour chacun, vérifier, avant la copie si le fichier existe déjà.
Si non, on copie, si oui, il faut peut être ajouter un suffixe au nom du fichier. Là encore, le script doit prévoir le cas où le nom avec suffixe existe, puis le nom avec suffixe et suffixe... et ainsi de suite.

Je regarde et je te prépare un script.
Cordialement


--------------------
iiMac 24 M1 16Go/1To 13.5.1
iMac 27 i5 3,1GHz 8Go/1To 10.11.6 / 10.6.8
iMac 20 C.Duo 2,6Ghz 8Go/350Go 10.6.8 / 10.11
Mini C.Duo 2,0Ghz 2Go/500Go 10.6.8
Go to the top of the page
 
+Quote Post
PBell
posté 26 Mar 2015, 22:00
Message #23


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 264
Inscrit : 7 Dec 2013
Lieu : Ile de France
Membre no 188 169



Bonsoir,
Comme promis le petit script qui vérifie, avant copie, si le fichier de même nom existe déjà dans le dossier de destination.

Si il existe déjà, j'ajoute un indice dans le nom avant la copie : xxxx.ext -> xxxx1.ext
Si le nom avec indice xxxx1.ext existe lui aussi, j'incrémente de nouveau l'indice en xxxx2.ext, et jusqu'à ce que la valeur d'indice n'existe pas dans le dossier destination.
Alors je copie !!

Il y a juste une petite astuce : je prends l'alias du fichier AVANT de modifier son nom. Ce faisant, je pointe toujours sur l'objet lui-même, même si son nom change.
C'est le rôle de la ligne "Set Ma_Ref to mon_item as alias" !
CODE
set Source to choose folder "dossier à copier"
set Destination to choose folder "dossier de sauvegarde"

-- copier avec vérification existence
tell application "Finder"
    set A_Copier to every item of Source
    set Dest to Destination as string
    repeat with mon_item in A_Copier -- pour chaque fichier
        set Ext to name extension of mon_item
        set nom_complet to name of mon_item
        set nom_base to text 1 thru ((offset of Ext in nom_complet) - 2) of nom_complet -- nom sans extension
        set indice to 1
        repeat until not ((Dest & nom_complet) exists)
            set nom_complet to nom_base & (indice as string) & "." & Ext -- si le fichier existe déjà on ajoute un indice entre le nom de base et l'extension
            set indice to indice + 1
        end repeat
        set Ma_Ref to mon_item as alias --cela permet de pointer sur l'objet lui-même quelque soit son nom !
        if nom_complet is not (name of mon_item) then set name of mon_item to nom_complet -- on change le nom avant copie
        duplicate Ma_Ref to Destination
    end repeat
end tell


Malheureusement ce code effectuant les copies des fichiers un par un est plus lent qu'une copie globale.
Cela peut être optimisé en sortant l'instruction duplicate de la boucle et en ajoutant juste avant un "set A_Copier to every item of Source".
Je ne l'ai pas fait ici car c'est peu être moins compréhensible pour tous.

Cordialement


--------------------
iiMac 24 M1 16Go/1To 13.5.1
iMac 27 i5 3,1GHz 8Go/1To 10.11.6 / 10.6.8
iMac 20 C.Duo 2,6Ghz 8Go/350Go 10.6.8 / 10.11
Mini C.Duo 2,0Ghz 2Go/500Go 10.6.8
Go to the top of the page
 
+Quote Post
benja
posté 26 Mar 2015, 22:26
Message #24


Thalès du pavé
*****

Groupe : Membres
Messages : 2 520
Inscrit : 30 Jul 2004
Membre no 21 573



Effectivement, c'est le genre d'opération qui gagne énormément en vitesse à être traitée en shell script (mais c'est nettement plus ardu pour un néophyte).


--------------------
Ryzen 3600 / GTX1080Ti / 32GB / Win 10 (Le nouveau mac pro quoi)
Go to the top of the page
 
+Quote Post
Hagrid
posté 27 Mar 2015, 08:37
Message #25


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Citation (benja @ 26 Mar 2015, 22:26) *
Effectivement, c'est le genre d'opération qui gagne énormément en vitesse à être traitée en shell script (mais c'est nettement plus ardu pour un néophyte).




bon on va déjà essayer de faire fonctionner celui-là biggrin.gif

Par contre lorsque je teste ton script il modifie la destination et la source et si je relance le script il remodifie tout.

je suis comme un touriste qui visite un musée sur l'art contemporain en chine... biggrin.gif

Bon j'espère quand même que je ne t'ai pas monopolisé ta soirée avec mes petits soucis.

Go to the top of the page
 
+Quote Post
PBell
posté 27 Mar 2015, 13:17
Message #26


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 264
Inscrit : 7 Dec 2013
Lieu : Ile de France
Membre no 188 169



Bonjour,
Effectivement, le script parcourt les fichiers du dossier Source et modifie leur nom lorsque ce même nom existe déjà dans le fichier Destination.
Il effectue ensuite la copie.
Pour les fichiers qui n'ont pas d'homonyme dans le dossier Destination, il ne fait que copier de Source à Destination.

On est obligé de faire comme cela en Applescript car il n'y a pas d'instruction pour copier en changeant de nom en même temps.
Si on copie, la copie garde le même nom et ci-delui-ci existe déjà dans Destination, alors le script génère une erreur.

On pourrait modifier ce script pour remettre, après copie, le nom d'origine dans Source. Je ne l'ai pas fait car ton besoin initial était de supprimer Source après la copie !
Voilà, j'espère que c'est plus clair.

Ceci étant, comme l'indique Benja, si on ne veut pas changer le nom dans Source, il est alors plus simple de passer par la commande Shell cp qui permet, elle, de copier tout en changeant de nom.

Si tu y tiens, je peux inclure le "do shell script" correspondant à cette commande cp... à toi de voir ?

Cordialement


--------------------
iiMac 24 M1 16Go/1To 13.5.1
iMac 27 i5 3,1GHz 8Go/1To 10.11.6 / 10.6.8
iMac 20 C.Duo 2,6Ghz 8Go/350Go 10.6.8 / 10.11
Mini C.Duo 2,0Ghz 2Go/500Go 10.6.8
Go to the top of the page
 
+Quote Post
Hagrid
posté 27 Mar 2015, 15:38
Message #27


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Je suis tellement largué que je voudrai juste que le script fonctionne avec mes critères sans déranger tout le monde avec mes exigences. Si cela est simple pour toi et que ça ne te prend pas trop de temps, je veux bien biggrin.gif après y'a pire dans la vie que de copier 3 fichiers manuellement smile.gif

Go to the top of the page
 
+Quote Post
PBell
posté 27 Mar 2015, 20:09
Message #28


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 264
Inscrit : 7 Dec 2013
Lieu : Ile de France
Membre no 188 169



Bonsoir,
C'est demandé si gentiment...
Voici le script qui vérifie les noms dans Destination, et ajoute un indice si le nom existe , pendant la copie.
Le contenu du dossier Source n'est donc pas changé.

CODE
set Source to choose folder "dossier à copier"
set Destination to choose folder "dossier de sauvegarde"

-- copier avec vérification existence
tell application "Finder"
    set A_Copier to every item of Source
    set Dest to Destination as string
    repeat with mon_item in A_Copier -- pour chaque fichier
        set Ext to name extension of mon_item
        set nom_complet to name of mon_item
        set nom_base to text 1 thru ((offset of Ext in nom_complet) - 2) of nom_complet -- nom sans extension
        set indice to 1
        repeat until not ((Dest & nom_complet) exists)
            set nom_complet to nom_base & (indice as string) & "." & Ext -- si le fichier existe déjà on ajoute un indice entre le nom de base et l'extension
            set indice to indice + 1
        end repeat
        -- copie de Mon_Item vers le dossier Destination avec le nom_complet
        do shell script "cp " & quoted form of (POSIX path of (mon_item as string)) & " " & quoted form of (POSIX path of Destination) & (quoted form of nom_complet)
        
    end repeat
end tell


Elle est pas belle la vie !


--------------------
iiMac 24 M1 16Go/1To 13.5.1
iMac 27 i5 3,1GHz 8Go/1To 10.11.6 / 10.6.8
iMac 20 C.Duo 2,6Ghz 8Go/350Go 10.6.8 / 10.11
Mini C.Duo 2,0Ghz 2Go/500Go 10.6.8
Go to the top of the page
 
+Quote Post
Hagrid
posté 28 Mar 2015, 08:34
Message #29


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



Salut PBell,

j'ai testé ton script mais j'ai une erreur lors de la copie dès le premier repertoire ici "Année 2005" : is a directory (not copied)." number 1

par contre il incrémente bien les .DS_Store -> .DS_Store1. -> .DS_Store2... (y'a pas moyen de virer ces @@&@&@&&@&... grrrr)

on doit pas etre très loin non ? rolleyes.gif



Go to the top of the page
 
+Quote Post
Hagrid
posté 28 Mar 2015, 08:56
Message #30


Nouveau Membre


Groupe : Membres
Messages : 21
Inscrit : 21 Mar 2015
Membre no 194 670



bon j'ai réussi à passer le message d'erreur par un :

do shell script "cp -Rp "

Le script s'exécute, il ne modifie pas le répertoire source quoiqu'il arrive.

Il copie la source vers la destination la première fois, mais si je relance le script il me crée un répertoire "Année 2001." avec la même structure que "Année 2005"

et les .DS_Store -> .DS_Store1. -> .DS_Store2... dry.gif
Go to the top of the page
 
+Quote Post

2 Pages V   1 2 >
Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 26th April 2024 - 23:21