IPB

Bienvenue invité ( Connexion | Inscription )

2 Pages V   1 2 >  
Reply to this topicStart new topic
> Inverser noms de fichiers en applescript + critères, Inverser deux noms de fichiers s'ils ont une racine commune
Options
Speed Moock
posté 30 Aug 2016, 13:36
Message #1


Adepte de Macbidouille
*

Groupe : Membres
Messages : 42
Inscrit : 30 Aug 2016
Membre no 199 619



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 !
Go to the top of the page
 
+Quote Post
ades
posté 30 Aug 2016, 13:58
Message #2


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 1 654
Inscrit : 23 Nov 2002
Membre no 4 808



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 ?


--------------------
MBP 15 unibody 2,4 Ghz , 4Go 320Go, OSX 10.10.5 / MacMini i7 2,3Ghz, 16Go, ssd 256Go, DD 1To avec fusion drive d'après Kalm, OSX 10.11.6
ce n'est pas parce qu'on n'a pas la télé qu'on n'est pas au courant…, au contraire!
Go to the top of the page
 
+Quote Post
yponomeute
posté 30 Aug 2016, 14:01
Message #3


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 4 491
Inscrit : 26 Jan 2011
Lieu : Pollachius virens
Membre no 164 083



Salut,

la racine "T_12345_codecoul_RG_" a toujours le même nombre de caractères ?
Go to the top of the page
 
+Quote Post
KOENIG Yvan
posté 30 Aug 2016, 14:32
Message #4


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 883
Inscrit : 22 Aug 2002
Lieu : 06220 VALLAURIS
Membre no 3 217



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.

Ce message a été modifié par KOENIG Yvan - 30 Aug 2016, 14:36.
Go to the top of the page
 
+Quote Post
Speed Moock
posté 30 Aug 2016, 15:01
Message #5


Adepte de Macbidouille
*

Groupe : Membres
Messages : 42
Inscrit : 30 Aug 2016
Membre no 199 619



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
Go to the top of the page
 
+Quote Post
PBell
posté 30 Aug 2016, 18:31
Message #6


Adepte de Macbidouille
*

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



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


--------------------
iMac 27 i7 2,8GHz 8Go/1To 10.6.8 /10.10 / 10.11
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
Speed Moock
posté 31 Aug 2016, 07:47
Message #7


Adepte de Macbidouille
*

Groupe : Membres
Messages : 42
Inscrit : 30 Aug 2016
Membre no 199 619



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.
Go to the top of the page
 
+Quote Post
Speed Moock
posté 31 Aug 2016, 08:12
Message #8


Adepte de Macbidouille
*

Groupe : Membres
Messages : 42
Inscrit : 30 Aug 2016
Membre no 199 619



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

Ce message a été modifié par Speed Moock - 31 Aug 2016, 08:12.
Fichier(s) joint(s)
Fichier joint  Capture_d___e__cran_2016_08_31_a___09.08.16.png ( 42.81 Ko ) Nombre de téléchargements : 9
 
Go to the top of the page
 
+Quote Post
chombier
posté 31 Aug 2016, 09:53
Message #9


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 5 784
Inscrit : 20 Mar 2003
Membre no 6 765



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 ?


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
Speed Moock
posté 31 Aug 2016, 10:31
Message #10


Adepte de Macbidouille
*

Groupe : Membres
Messages : 42
Inscrit : 30 Aug 2016
Membre no 199 619



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


Fichier(s) joint(s)
Fichier joint  Capture_d___e__cran_2016_08_31_a___11.31.17.png ( 41.76 Ko ) Nombre de téléchargements : 4
 
Go to the top of the page
 
+Quote Post
chombier
posté 31 Aug 2016, 10:40
Message #11


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 5 784
Inscrit : 20 Mar 2003
Membre no 6 765



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


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
Speed Moock
posté 31 Aug 2016, 11:07
Message #12


Adepte de Macbidouille
*

Groupe : Membres
Messages : 42
Inscrit : 30 Aug 2016
Membre no 199 619



Merci Chombier, j'essaye right now
Go to the top of the page
 
+Quote Post
PBell
posté 31 Aug 2016, 12:17
Message #13


Adepte de Macbidouille
*

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



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


--------------------
iMac 27 i7 2,8GHz 8Go/1To 10.6.8 /10.10 / 10.11
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
chombier
posté 31 Aug 2016, 12:20
Message #14


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 5 784
Inscrit : 20 Mar 2003
Membre no 6 765



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



Ce message a été modifié par chombier - 31 Aug 2016, 12:28.


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
Speed Moock
posté 31 Aug 2016, 12:34
Message #15


Adepte de Macbidouille
*

Groupe : Membres
Messages : 42
Inscrit : 30 Aug 2016
Membre no 199 619



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

Go to the top of the page
 
+Quote Post
PBell
posté 31 Aug 2016, 12:45
Message #16


Adepte de Macbidouille
*

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




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

Ce message a été modifié par PBell - 31 Aug 2016, 12:46.


--------------------
iMac 27 i7 2,8GHz 8Go/1To 10.6.8 /10.10 / 10.11
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
Speed Moock
posté 31 Aug 2016, 12:49
Message #17


Adepte de Macbidouille
*

Groupe : Membres
Messages : 42
Inscrit : 30 Aug 2016
Membre no 199 619



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
Go to the top of the page
 
+Quote Post
chombier
posté 31 Aug 2016, 12:50
Message #18


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 5 784
Inscrit : 20 Mar 2003
Membre no 6 765



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.


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
Speed Moock
posté 31 Aug 2016, 13:02
Message #19


Adepte de Macbidouille
*

Groupe : Membres
Messages : 42
Inscrit : 30 Aug 2016
Membre no 199 619



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) !
Fichier(s) joint(s)
Fichier joint  Capture_d___e__cran_2016_08_31_a___13.53.42.png ( 107.19 Ko ) Nombre de téléchargements : 7
 
Go to the top of the page
 
+Quote Post
chombier
posté 31 Aug 2016, 13:07
Message #20


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 5 784
Inscrit : 20 Mar 2003
Membre no 6 765



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


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
PBell
posté 31 Aug 2016, 13:13
Message #21


Adepte de Macbidouille
*

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



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 ?


--------------------
iMac 27 i7 2,8GHz 8Go/1To 10.6.8 /10.10 / 10.11
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
chombier
posté 31 Aug 2016, 13:34
Message #22


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 5 784
Inscrit : 20 Mar 2003
Membre no 6 765



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 chez Apple:
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 ?


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
PBell
posté 31 Aug 2016, 13:45
Message #23


Adepte de Macbidouille
*

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



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 !

Ce message a été modifié par PBell - 31 Aug 2016, 13:46.


--------------------
iMac 27 i7 2,8GHz 8Go/1To 10.6.8 /10.10 / 10.11
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
Zeltron54
posté 31 Aug 2016, 15:17
Message #24


Adepte de Macbidouille
*

Groupe : Membres
Messages : 112
Inscrit : 15 Mar 2008
Lieu : Lorraine
Membre no 110 156



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


--------------------
Imac 27 I7 Fusion drive fin 2013 Ram 8Go Mac OS X (10.13.4)
MacBook Pro 15 pouces mi-2012 8Go Ram Mac OS X (10.13.4)
Go to the top of the page
 
+Quote Post
PBell
posté 31 Aug 2016, 17:16
Message #25


Adepte de Macbidouille
*

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



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 !


--------------------
iMac 27 i7 2,8GHz 8Go/1To 10.6.8 /10.10 / 10.11
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
Zeltron54
posté 31 Aug 2016, 17:29
Message #26


Adepte de Macbidouille
*

Groupe : Membres
Messages : 112
Inscrit : 15 Mar 2008
Lieu : Lorraine
Membre no 110 156



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 !



--------------------
Imac 27 I7 Fusion drive fin 2013 Ram 8Go Mac OS X (10.13.4)
MacBook Pro 15 pouces mi-2012 8Go Ram Mac OS X (10.13.4)
Go to the top of the page
 
+Quote Post
chombier
posté 31 Aug 2016, 20:52
Message #27


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 5 784
Inscrit : 20 Mar 2003
Membre no 6 765



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]

Ce message a été modifié par chombier - 31 Aug 2016, 20:54.


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
PBell
posté 31 Aug 2016, 21:10
Message #28


Adepte de Macbidouille
*

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



@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


--------------------
iMac 27 i7 2,8GHz 8Go/1To 10.6.8 /10.10 / 10.11
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
chombier
posté 31 Aug 2016, 22:02
Message #29


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 5 784
Inscrit : 20 Mar 2003
Membre no 6 765



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


--------------------
késtananafout' (:
Go to the top of the page
 
+Quote Post
Speed Moock
posté 1 Sep 2016, 00:05
Message #30


Adepte de Macbidouille
*

Groupe : Membres
Messages : 42
Inscrit : 30 Aug 2016
Membre no 199 619



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.

Ce message a été modifié par Speed Moock - 1 Sep 2016, 00:18.
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 : 21st May 2018 - 02:02