Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forums MacBidouille _ La Programmation En Général _ Inverser noms de fichiers en applescript + critères

Écrit par : Speed Moock 30 Aug 2016, 13:36

Bonjour,
J'ai beau avoir bénéficié d'une formation applescript il y a un an, j'ai du mal à m'y remettre et je sollicite votre aide sur ce sujet a priori simple :

Je veux écrire un script qui scannera le contenu d'un dossier contenant des images et qui en inversera les noms quand une condition est remplie.
Les images sont toutes nommées selon la structure suivante :
T_12345_codecoul_RG_1_78999.jpg

La racine "T_12345_codecoul_RG_" peut-être commune à plusieurs images du dossier.
L'unicité du nom vient du reste de la chaine de caractère.
RG_ me donne le numéro de l'image.
par exemple RG_1 pour l'image n°1 d'un produit, RG_2 l'image n°2 etc..

ce que doit faire le script :
quand il trouve une image n°2 et n°3 qui ont la même racine, il doit en permuter les noms intégralement.
Naturellement le script ne parcours qu'une fois le dossier !

Exemple :
Avant passage du script
image A : T_12345_codecoul_RG_2_78999.jpg
image B : T_12345_codecoul_RG_3_12121.jpg
Après passage du script :
image A : T_12345_codecoul_RG_3_12121.jpg
image B : T_12345_codecoul_RG_2_78999.jpg

Pouvez-vous m'aider ?

merci beaucoup !

Écrit par : ades 30 Aug 2016, 13:58

pas compris sad.gif
dans ton exemple, si "image A :" et "image B" n'appartiennent pas au nom du fichier, c'est juste l'ordre d'affichage qui est modifié, non ?

Écrit par : yponomeute 30 Aug 2016, 14:01

Salut,

la racine "T_12345_codecoul_RG_" a toujours le même nombre de caractères ?

Écrit par : KOENIG Yvan 30 Aug 2016, 14:32

Est-il possible de trouver plus de deux fichiers dotés de la même racine?
Si oui que fait-on ?

Le principe est de faire :
set nomA to name of image A
set nomB to name of image B
set name of image A to nomB & "@@@" # pour éviter de doublonner
set name of image B to nomA
set name of image A to nomB

Y-a-t-il un risque d'avoir un ou plusieurs caractères / dans un nom ?
Si oui il faut impérativement travailler avec le "Finder" que je déteste.
Dans le cas contraire on peut travailler avec "System Events" ou avec le shell.

Écrit par : Speed Moock 30 Aug 2016, 15:01

Bonjour,

Merci pour vos premiers retour.

Quelques précisions :
- Oui la structure de la racine est toujours la même, à savoir :
une lettre
underscore
8 chiffres
underscore
trois ou quatre chiffres
underscore
les lettres RG
underscore
1 chiffre
underscore
1 nombre unique à 6 chiffres

Dans le dossier on peut trouver de 1 à 4 fichiers ayant la même racine se terminant par RG_1, RG_2, RG_3 et RG_4. On n'inversera les noms que des fichiers contenant RG_2 et RG_3.
le principe qu'énonce KOENIG est exactement celui qu'il décrit.

Enfin une précision je devrais faire tourner ce script sur des dossiers qui seront sur un serveur distant, pas en local sur mon mac... ça a peut-être uen importance !

merci

Écrit par : PBell 30 Aug 2016, 18:31

Bonsoir,

Si j'ai bien compris ta demande, le script ci-dessous y réponds.
Je l'ai largement commenté pour que tu puisses l'adapter si j'ai mal compris une partie.

CODE
(* plusieurs cas sont possibles pour le même préfixe de type  X_12345678_123_
- RG_1 existe seul, ou RG_1 et RG_2 -> on ne fait rien !
- RG_1, RG_2, RG_3 existent, avec ou sans RG_4 -> on interverti RG_2 et RG_3

Donc on commence donc par rechercher les RG_3
On vérifie ensuite l'existence d'un RG_2 de même préfixe et, si on le trouve,  on permute les indices en gardant le préfixe et le suffixe

Important : on suppose que tout les fichiers ont la même extension
*)

set monDossier to choose folder "sélectionner le dossier à traiter"
set TDossier to monDossier as string

tell application "Finder"
    set ListeRG3 to name of every item of folder monDossier whose name contains "RG_3"
    set AppleScript's text item delimiters to "RG_"
    repeat with NomRG3 in ListeRG3 -- boucle traiter tout les RG_3
        set Prefixe to text item 1 of NomRG3 -- X_12345678_123_
        set SuffixeRG3 to text item 2 of NomRG3 -- 3_12345.jpg
        set SuffixeRG3 to text 2 thru -1 of SuffixeRG3 -- supprime le "3" devant
        set RG2 to Prefixe & "RG_2" -- même début de nom que le RG_3, mais avec RG2
        log "RG2 = " & RG2
        set ListeRG2 to (name of every item of folder monDossier whose name contains RG2)
        if ListeRG2 is {} then
            -- ne rien faire, car RG_3 existe, mais pas RG_2
        else -- RG_2 et RG_3 existent
            set NomRG2 to item 1 of ListeRG2 -- on suppose qu'il ne peut y avoir qu'un seul RG_2 !
            set SuffixeRG2 to text item 2 of NomRG2
            set SuffixeRG2 to text 2 thru -1 of SuffixeRG2 -- supprime le "2" devant
            log "noms=" & NomRG3 & return & NomRG2
            log "prefixe = " & Prefixe
            log "suffixes = " & SuffixeRG2 & return & SuffixeRG3
            set name of ((TDossier & NomRG3) as alias) to Prefixe & "RG_2" & SuffixeRG3 -- met RG3 avec l'indice RG_2
            set name of ((TDossier & NomRG2) as alias) to Prefixe & "RG_3" & SuffixeRG2 -- met RG2 avec l'indice RG_3
        end if
    end repeat
end tell


Cordialement

Écrit par : Speed Moock 31 Aug 2016, 07:47

Bonjour,

Merci je vais teste de suite ! Par contre c'est le nom complet qu'il faut permuter et pas seulement les indices 2 et 3.

Je vais essayer de modifier le code. Si je ne m'en sors pas je vous recontacte.

en tous cas merci beaucoup ! pour la réactivité et la qualité des réponses.

Écrit par : Speed Moock 31 Aug 2016, 08:12

RE !

Alors je viens de tester mais visiblement le script inverse les premiers RG_2 et RG_3 qu'il rencontre, alors qu'il doit le faire uniquement sur ceux qui ont le même préfixe.
Sur la copie écran ci-joint il faudrait uniquement inverser les noms des fichiers en vert. Or il inverse avec celui qui est rouge.

Je travaille votre code de mon côté mais vous y arrivez avant moi certainement

Merci d'avance

 

Écrit par : chombier 31 Aug 2016, 09:53

Y'a un problème. D'après ta copie d'écran, tu as plusieurs fichiers RG_3 qui commencent par le même préfixe:

G_37744390_378_RG_3_21234.jpg
G_37744390_378_RG_3_45632.jpg

Le script de PBell suppose qu'il ne peut y avoir qu'un seul couple (RG_2,RG_3) possédant le même préfixe.

A quoi devrait correspondre G_37744390_378_RG_2_7890.jpg ? au premier ou au second RG_3 ?

Écrit par : Speed Moock 31 Aug 2016, 10:31

Bonjour,

En effet mon dossier n'est pas bon et il y a un doublon. Le second RG_3 est en trop dans mon dossier.
Du coup le G_37744390_378_RG_2_7890.jpg doit correspondre au premier RG_3

Ci-dessous la bonne copie écran
Merci



 

Écrit par : chombier 31 Aug 2016, 10:40

Je pense qu'il faut passer par un nom de fichier intermédiaire lors du changement de nom.

Code
            set name of ((TDossier & NomRG3) as alias) to Prefixe & "RG_2" & SuffixeRG3 -- met RG3 avec l'indice RG_2
            set name of ((TDossier & NomRG2) as alias) to Prefixe & "RG_3" & SuffixeRG2 -- met RG2 avec l'indice RG_3

La première ligne essaie de renommer RG3 en RG2, mais le fichier RG2 existe déjà.

Écrit par : Speed Moock 31 Aug 2016, 11:07

Merci Chombier, j'essaye right now

Écrit par : PBell 31 Aug 2016, 12:17

Bonjour,
Effectivement, j'ai supposé que pour un préfixe donnée, il n'y avait qu'un seul RG_2 et un seul RG_3 dans le dossier. Il est possible de gérer en erreur les cas de doublons si tu estime cela nécessaire.

Par contre, je ne comprends pas la nécessité de passer par un fichier intermédiaire.
Je l'avais considéré dans une version provisoire du script, mais il m'est apparut que ce n'était pas nécessaire.

Prenons un exemple (Speed Monck n'hésite pas à me corriger si j'ai mal compris) :
On a 2 fichiers de même préfixe (=Prefixe1), d'indice 2 et 3 et de suffixes différents (Suffixe1 et Suffixe2) :
- Fichier 1 : nom = Prefixe1_RG2_Suffixe1
- Fichier 2 : nom = Prefixe1_RG3_Suffixe2

Le script renomme d'abord le fichier 2 en : Prefixe1_RG2_Suffixe2
Comme ce nom a un suffixe différent de celui du fichier 1, pas besoin de nom intermédiaire
Puis le script renomme le fichier 1 en : Prefixe1_RG3_Suffixe1.

Résultat :
- Fichier 1 : nom = Prefixe1_RG3_Suffixe1
- Fichier 2 : nom = Prefixe1_RG2_Suffixe2

En fait, il serait seulement nécessaire de passer via un nom temporaire si, et seulement si, il est possible que 2 fichiers de même préfixes aient aussi le même suffixe. est-ce possible ? Si c'est le cas, je changerai mon script.

Cordialement

Écrit par : chombier 31 Aug 2016, 12:20

Citation (PBell @ 31 Aug 2016, 13:17) *
Par contre, je ne comprends pas la nécessité de passer par un fichier intermédiaire.
Je l'avais considéré dans une version provisoire du script, mais il m'est apparut que ce n'était pas nécessaire.

En fait, je me suis basé sur son premier exemple pour voir un conflit de noms:
Citation (Speed Moock @ 30 Aug 2016, 14:36) *
Avant passage du script
image A : T_12345_codecoul_RG_2_78999.jpg
image B : T_12345_codecoul_RG_3_12121.jpg
Après passage du script :
image A : T_12345_codecoul_RG_3_12121.jpg
image B : T_12345_codecoul_RG_2_78999.jpg

Dans cet exemple, "image A" prend le nom "image B" et vice-versa.

D'ailleurs, en relisant, il me semble qu'il ne faut pas inverser SuffixeRG2 et SuffixeRG3:
Code
set TmpNomRG3 to NomRG3 & ".tmp"
set name of ((TDossier & NomRG3) as alias) to TmpNomRG3
set name of ((TDossier & NomRG2) as alias) to Prefixe & "RG_3" & SuffixeRG3
set name of ((TDossier & TmpNomRG3) as alias) to Prefixe & "RG_2" & SuffixeRG2


Écrit par : Speed Moock 31 Aug 2016, 12:34

Bonjour,

je viens de lire vos post et je pense que je me suis mal exprimé.

Si on reprends l'exemple de PBell :
- Fichier 1 : nom = Prefixe1_RG2_Suffixe1
- Fichier 2 : nom = Prefixe1_RG3_Suffixe2

Le résultat doit être :
Fichier 1 : nom = Prefixe1_RG3_Suffixe2
Fichier 2 : nom = Prefixe1_RG2_Suffixe1

On échange intégralement les noms. Donc je pense qu'il peut y avoir un bug à la première écriture. D'où l'idée de passer par un nom tampon.

Rappel :
Les préfixes ne sont pas uniques
Les suffixes le sont
Un préfixe concaténé de RG2 ou RG3 devient unique. C'est à dire qu'il ne peut pas exister de Prefixe1_RG2_Suffixe1 et Prefixe1_RG2_Suffixe2 dans le même dossier.

Merci


Écrit par : PBell 31 Aug 2016, 12:45


Nos posts se sont croisés.
Chombier tu avais raison !

Speed Moock, voici donc le script corrigé qui passe par un nom temporaire :

CODE
set monDossier to choose folder "sélectionner le dossier à traiter"
set TDossier to monDossier as string

tell application "Finder"
    set ListeRG3 to name of every item of folder monDossier whose name contains "RG_3"
    set AppleScript's text item delimiters to "RG_"
    repeat with NomRG3 in ListeRG3 -- boucle traiter tout les RG_3
        set Prefixe to text item 1 of NomRG3 -- X_12345678_123_
        set SuffixeRG3 to text item 2 of NomRG3 -- 3_12345.jpg
        set SuffixeRG3 to text 2 thru -1 of SuffixeRG3 -- supprime le "3" devant
        set RG2 to Prefixe & "RG_2" -- même début de nom que le RG_3, mais avec RG2
        set ListeRG2 to (name of every item of folder monDossier whose name contains RG2)
        if ListeRG2 is {} then
            -- ne rien faire, car RG_3 existe, mais pas RG_2
        else -- RG_2 et RG_3 existent
            set NomRG2 to item 1 of ListeRG2 -- on suppose qu'il ne peut y avoir qu'un seul RG_2 !
            set SuffixeRG2 to text item 2 of NomRG2
            set SuffixeRG2 to text 2 thru -1 of SuffixeRG2 -- supprime le "2" devant
            set NomTemp to Prefixe & "Temp_" & SuffixeRG3
            set name of ((TDossier & NomRG3) as alias) to NomTemp -- met RG3 avec nom temporaire
            set name of ((TDossier & NomRG2) as alias) to Prefixe & "RG_3" & SuffixeRG3 -- met RG2 avec l'indice RG_3 et le suffixe RG3
            set name of ((TDossier & NomTemp) as alias) to Prefixe & "RG_2" & SuffixeRG2 -- met RG3 avec RG_2 et suffxe 2
        end if
    end repeat
end tell


Cordialement

Écrit par : Speed Moock 31 Aug 2016, 12:49

Je viens de tester avec le bout de code proposé par Chombier. ça fonctionne à la première inversion puis le script continue avec les autres RG3 de sa liste et du coup retraite le RG2 qu'il vient de créer au premier passage.
Il faut en quelque sorte que le script teste que le RG2 qu'il vient de trouver à la même racine que le RG3 courant.

sorry j'avais pas testé le nouveau code de Pbell.

je le fais de suite
merci

Écrit par : chombier 31 Aug 2016, 12:50

Citation (Speed Moock @ 31 Aug 2016, 13:45) *
Je viens de tester avec le bout de code proposé par Chombier. ça fonctionne à la première inversion puis le script continue avec les autres RG3 de sa liste et du coup retraite le RG2 qu'il vient de créer au premier passage.
Il faut en quelque sorte que le script teste que le RG2 qu'il vient de trouver à la même racine que le RG3 courant.

C'est bizarre: le script ne boucle que sur les fichiers commençant par RG3_, et en fait la liste au début du traitement...
Si tu le lances deux fois, tu devrais retrouver le contenu original.

Écrit par : Speed Moock 31 Aug 2016, 13:02

J'ai le message d'erreur suivant



J'ai corrigé cette ligne :
set ListeRG2 to (name of every item of folder monDossier whose name contains "RG_2")

Et ça mAAAAArche !!!

Merci beaucoup et une bière est offerte pour tout passage dans la bonne ville de Arras (62) !

 

Écrit par : chombier 31 Aug 2016, 13:07

C'est sans doute les parenthèses dans:

Code
set ListeRG2 to (name of every item of folder monDossier whose name contains RG2)
Puisque la première liste avec ListeRG3 fonctionne...

Citation (Speed Moock @ 31 Aug 2016, 14:02) *
J'ai le message d'erreur suivant



J'ai corrigé cette ligne :
set ListeRG2 to (name of every item of folder monDossier whose name contains "RG_2")

Et ça mAAAAArche !!!

Merci beaucoup et une bière est offerte pour tout passage dans la bonne ville de Arras (62) !

Euh... non, ça marche pas. huh.gif
Le premier fichier RG2 trouvé dans la liste sera associé au premier fichier RG3, quelque soit le préfixe, tu vas tout niquer...

Écrit par : PBell 31 Aug 2016, 13:13

Je suis dubitatif sur ta dernière correction.

QUOTE
set ListeRG2 to (name of every item of folder monDossier whose name contains "RG_2")


En effet, cette ligne, maintenant corrigée va lister tous les fichiers contenant "RG_2" alors que à ce stade du script, on ne veut trouver que les fichiers contenant le même préfixe (que le RG_3 en cours de traitement) suivi de RG2.

Par exemple si je traite le fichier T_123456_RG_3_xxxxxxx.
le dossier contient les fichiers T_123456_RG_2_yyyyy et T1111111_RG_2_zzzzzzz

Avec la ligne originale, la recherche ne trouvera que le fichier T_123456_RG_2_yyyyy
Avec la ligne telle que tu l'as modifiée, la recherche trouvera tous les fichier contenant "RG_2" donc les 2 fichiers T_123456_RG_2_yyyyy et T1111111_RG_2_zzzzzzz

Cordialement

PS : as tu lu mon script corrigé avec les remarques de Chombier ?

Écrit par : chombier 31 Aug 2016, 13:34

Ok, je pense avoir compris.
Il y a une erreur -1728 provoquée là dedans:

Code
        set ListeRG2 to (name of every item of folder monDossier whose name contains RG2)
L'erreur -1728 https://developer.apple.com/library/mac/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_error_codes.html:
Citation
-1728: The referenced object doesn’t exist. This is a run-time resolution error, such as when attempting to reference a third object when only two objects exist.

Ce qui pourrait vouloir dire que tu as des fichiers RG_3 sans fichier RG_2 associé, et que ça fait planter cette ligne de code.
Peut-être en ajoutant des exceptions autour ?

Et sinon, elles servent à quoi les parenthèses de set ListeRG2 to () qui ne sont pas présentes dans set ListeRG3 ?

Écrit par : PBell 31 Aug 2016, 13:45

Effectivement, si pas de RG2 ça plante.
Il faut remplacer cette ligne par ces 4 lignes :

CODE
        set ListeRG2 to {}
        try
            set ListeRG2 to (name of every item of folder monDossier whose name contains RG2)
        end try


Si aucun fichier RG2 n'existe avec le préfixe voulu, alors le test if qui suit fera sauter au prochain fichier RG_3 du dossier.

Cordialement

PS : on peut effacer les () effectivement..pourquoi les ai-je mis ici et pas de RG3....une étourderie !

Écrit par : Zeltron54 31 Aug 2016, 15:17

Bonjour,

Pour éviter le plantage si pas de RG2 il suffit de vérifier s'il existe.
On obtient le code:

Code
set monDossier to choose folder "sélectionner le dossier à traiter"
set TDossier to monDossier as string

tell application "Finder"
    set ListeRG3 to name of every item of folder monDossier whose name contains "RG_3"
    set AppleScript's text item delimiters to "RG_"
    repeat with NomRG3 in ListeRG3 -- boucle traiter tout les RG_3
        set Prefixe to text item 1 of NomRG3 -- X_12345678_123_
        set SuffixeRG3 to text item 2 of NomRG3 -- 3_12345.jpg
        set SuffixeRG3 to text 2 thru -1 of SuffixeRG3 -- supprime le "3" devant
        set RG2 to Prefixe & "RG_2" -- même début de nom que le RG_3, mais avec RG2
        
        
        if exists (every file of monDossier whose name contains RG2) then -- verifie si un fichier avec prefixe & RG_2 existe
            
            set nomRG2 to (name of every item of folder monDossier whose name contains RG2)
            set name of ((TDossier & NomRG3) as alias) to "NomTemp" -- met RG3 avec nom temporaire
            set name of ((TDossier & nomRG2) as alias) to NomRG3 -- met RG2 avec l'indice RG_3 et le suffixe RG3
            set name of ((TDossier & "NomTemp") as alias) to nomRG2 -- met RG3 avec RG_2 et suffxe 2
            
        end if
        
    end repeat
end tell

Écrit par : PBell 31 Aug 2016, 17:16

Effectivement Zeltron, on peut utiliser la function "exists" mais dans ce cas, le résultat de name of every file... est une liste et pas un nom, d'où une erreur de type lors de l'execution.

Pour éviter cette erreur, il faut changer l'extraction du suffixe2 en : "set SuffixeRG2 to text item 2 of (item 1 of nomRG2)"
C'est à dire en prenant l'item 1 de la liste NomRG2.

Malgré cette correction, ta suggestion simplifie le code :

CODE
set monDossier to choose folder "sélectionner le dossier à traiter"
set TDossier to monDossier as string

tell application "Finder"
    set ListeRG3 to name of every item of folder monDossier whose name contains "RG_3"
    set AppleScript's text item delimiters to "RG_"
    repeat with NomRG3 in ListeRG3 -- boucle traiter tout les RG_3
        set Prefixe to text item 1 of NomRG3 -- X_12345678_123_
        set SuffixeRG3 to text item 2 of NomRG3 -- 3_12345.jpg
        set SuffixeRG3 to text 2 thru -1 of SuffixeRG3 -- supprime le "3" devant
        set RG2 to Prefixe & "RG_2" -- même début de nom que le RG_3, mais avec RG2
        if exists (every file of monDossier whose name contains RG2) then -- verifie si un fichier avec prefixe & RG_2 existe
            set nomRG2 to (name of every item of folder monDossier whose name contains RG2)
            set SuffixeRG2 to text item 2 of (item 1 of nomRG2)
            set SuffixeRG2 to text 2 thru -1 of SuffixeRG2 -- supprime le "2" devant
            set NomTemp to Prefixe & "Temp_" & SuffixeRG3
            set name of ((TDossier & NomRG3) as alias) to NomTemp -- met RG3 avec nom temporaire
            set name of ((TDossier & nomRG2) as alias) to Prefixe & "RG_3" & SuffixeRG3 -- met RG2 avec l'indice RG_3 et le suffixe RG3
            set name of ((TDossier & NomTemp) as alias) to Prefixe & "RG_2" & SuffixeRG2 -- met RG3 avec RG_2 et suffxe 2
        end if
    end repeat
end tell


Merci !

Écrit par : Zeltron54 31 Aug 2016, 17:29

Le test "exists" ne sert qu'a savoir si je récupère le nom complet du fichier dans NomRG2
Pourquoi t'embêter à extraire les suffixes et reconstruire les noms ?
Tu les as tout prêt (les noms) dans tes variables NomRG2 et NomRG3, c'est pourquoi ensuite je fais les 3 changements avec ces variables !

J'ai tester mon code (TON code juste modifié par moi) pas d'erreur...

Plus qu'a attendre le verdict de "Speed Moock"

Félicitation pour ton code !


Écrit par : chombier 31 Aug 2016, 20:52

Je suis plus en faveur du try ... end try.
L'exécution sera plus rapide que de lister deux fois le même contenu du dossier, surtout si c'est sur un volume distant.
D'ailleurs, il vaudrait mieux créer une seconde liste avant la boucle.

[edit]
Speed Moock n'est pas revenu. J'espère qu'il n'a pas niqué ses fichiers originaux en utilisant son script modifié, croyant que ça marchait... unsure.gif
[/edit]

Écrit par : PBell 31 Aug 2016, 21:10

@Chombier,

Le côté négatif de faire une seconde liste avant la boucle est que le script devra ensuite chercher dans cette seconde liste si un item avec le même préfixe correspond. Cela se fera via une boucle dans le script sur les items de cette seconde liste....
Pas sûr que l'on gagne en vitesse par rapport à un get every item whose name contains "xxx".

Cependant, tu as raison de vouloir accélérer dans le cas d'un dossier sur un serveur lent (ou réseau lent).

Dans ce cas, je suggère un "do shell script" avec instruction "find ".
"find" sera beaucoup plus rapide : c'est même ce que je connais de plus rapide !

Mais il faut précéder cela d'une transformation de chemin via POSIX (chemin Finder en chemin Unix) encaspsulé dans un "quoted form of " pour éviter les espaces et autres caractère qui pourraient exister vers le dossier.

Ensuite, il faudra reprendre le résultat du do shell script pour séparer le chemin du nom du fichier, avec peut être aussi des conversion de caractères spéciaux

...Bref, au total, va-t-on y gagner beaucoup ? Qu'en pensez vous ?
On va surement y perdre en simplicité.

Cordialement

Écrit par : chombier 31 Aug 2016, 22:02

A tester. Je pense que parcourir une liste déjà en mémoire est beaucoup plus rapide que de déclencher une recherche dans des dossiers pour chaque RG_3.

Code
set monDossier to choose folder "sélectionner le dossier à traiter"
set TDossier to monDossier as string

tell application "Finder"
    set ListeRG3 to name of every item of folder monDossier whose name contains "RG_3"
    set ListeRG2 to name of every item of folder monDossier whose name contains "RG_2"
    set AppleScript's text item delimiters to "RG_"
    repeat with NomRG3 in ListeRG3 -- boucle traiter tout les RG_3
        set Prefixe to text item 1 of NomRG3 -- X_12345678_123_
        set RG2 to Prefixe & "RG_2" -- même début de nom que le RG_3, mais avec RG2
        repeat with i from 1 to count ListeRG2
            if ListeRG2's item i contains RG2 then
                set NomRG2 to ListeRG2's item i
                set NomTemp to Prefixe & ".tmp"
                set name of ((TDossier & NomRG3) as alias) to NomTemp
                set name of ((TDossier & NomRG2) as alias) to NomRG3
                set name of ((TDossier & NomTemp) as alias) to NomRG2
                exit repeat
            end if
        end repeat
    end repeat
end tell

Écrit par : Speed Moock 1 Sep 2016, 00:05

Bonsoir à tous !

Bon alors je n'ai pas encore mis en prod le script que je pensais avoir modifié correctement (bouh l'apprenti sorcier que je fais) donc pas de dégât pour le moment.
Effectivement je peux avoir des RG_3 dans mon dossier et qui n'ont pas de RG_2...

Du coup j'ai testé le code de Chombier et il fonctionne.

Je teste demain sur un serveur distant pour voire la rapidité.

En tout cas merci encore à tous.

Écrit par : Speed Moock 1 Sep 2016, 20:33

Bonsoir,

Bilan ça fonctionne !

Donc maintenant pour aller plus loin je veux implanter ce code dans un Service Automator pour le lancer en faisant clic droit sur le dossier à traiter.

Or dans Automator la variable d'entrée est {input, parameters}.
J'ai essaye en mettant un "set monDossier to selection"... mais ça ne marche pas.

Quelle est la syntaxe exacte ?

Merci

Écrit par : chombier 2 Sep 2016, 00:13

Citation (Speed Moock @ 1 Sep 2016, 21:33) *
Bonsoir,

Bilan ça fonctionne !

Donc maintenant pour aller plus loin je veux implanter ce code dans un Service Automator pour le lancer en faisant clic droit sur le dossier à traiter.

Or dans Automator la variable d'entrée est {input, parameters}.
J'ai essaye en mettant un "set monDossier to selection"... mais ça ne marche pas.

Quelle est la syntaxe exacte ?

Merci

Alors, Automator, je connais pas trop, mais je crois que la syntaxe est basée sur des clic souris... unsure.gif

Écrit par : PBell 2 Sep 2016, 06:26

Bonjour,
Dans le Service Automator, il faut commencer par indiquer, en haut de la fenêtre, ce que le service reçoit comme information et à partir de quelle application.

En face de "Le service reçoit la selection" -> sélectionner "Fichiers ou dossier"
puis, "dans" -> sélectionner "Finder"

Il faut ensuite ajouter une seule action : "Exécuter un script Applescript"
Par défaut, cette action contient :

CODE
on run {input, parameters}
    (* Your script goes here *)
    return input
end run


C'est la variable input qu'il faut utiliser pour récupérer le dossier sur lequel tu as fait le click droit.
Comme ton click droit contient la sélection, la première ligne de ton script, demandant de choisir le dossier, n'est plus nécessaire.
L'action script devient :
CODE
on run {input, parameters}    
    set monDossier to input
    (* mettre le reste du script qui fonctionne ici, en supprimant la 1ère ligne "set monDossier to choose folder "sélectionner le dossier à traiter" *)
    return input
end run


Tu enregistres le service (avec un nom explicite) et cela fonctionne. Ne cherche pas à tester la service dans Automator, tu auras une alerte car en mode direct, Automator ne peut récupérer les variables d'un service.

Pour être complet, j'ajoute qu'un tel service Automator pourrait recevoir, lors du click droit, non pas 1 dossier, mais toute une selection de dossiers ou fichiers. Dans ce cas, il faudrait faire une boucle sur chacun des items de "input" et vérifier que c'est bien un dossier (pas un fichier). Mais alors, me direz-vous, la variable input devrait être une liste d'items et pas un dossier !!
Oui, sauf que Automator est très gentil et lorsqu'il voit que Input ne contient qu'un élément, il accepte de le prendre comme tel et pas comme un seul item d'un liste !! Merci Apple !

Il reste que pour être vraiment propre, ton script devrait aussi comporter une ligne qui teste si monDossier" est bien un dossier et pas un fichier !

Cordialement

Écrit par : Speed Moock 4 Sep 2016, 16:40

Bonjour,

Parfait ! ça fonctionne.

Merci beaucoup et à bientôt (cf le prochain post que je vais ouvrir).

A+

Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)