IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

déplacer grand nombre de photos


Sujet :

AppleScript

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 6
    Par défaut déplacer grand nombre de photos
    Bonjour,

    J'ai une architecture avec ce modèle :
    Un dossier contenant plein de sous dossier. Chaque sous dossier possède une seule image portant le même nom. Le principe de numérotation pour chaque image est le suivant : x.y
    x les numéros des dossiers
    y les numéros des sous dossiers (et de chaque image contenue dedans)

    Mon problème est que je veux déplacer chaque image dans le dossier supérieur pour supprimer tous les sous dossiers. Cette opération est très longue à la main vu la quantité d'images que j'ai. Est-il possible de faire un applescript pour cela ? Je n'ai aucune connaissance dans ce langage.

    Merci pour votre aide par avance !

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut bouger des fichiers
    Bonjour "Oui Monsieur",

    Si je comprends bien ton problème, tu as un dossier "Parent" qui contient par exemple les sous-dossiers A, B et C.
    Dans le sous dossier A se trouve un (ou plusieurs) fichier image par exemple Photo.JPG. Même chose pour les sous dossiers B et C

    Tu souhaites que le programme te donne le dossier "Parent" avec les fichiers suivants : A.Photo.JPG, B.Photo.JPG, C.Photo.JPG (le nom est celui du sous-dossier "." celui du fichier initial).
    Les sous dossiers A, B et C étant supprimés.

    Alors voici le code correspondant. Je l'ai commenté pour que tu puisses le modifier si nécessaire.
    Les sous dossiers peuvent contenir un ou plusieurs fichiers avec des noms différents, cela fonctionne aussi !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    tell application "Finder"
    	-- Selection du dossier principal
    	set DossRacine to ((choose folder with prompt "Choisissez le dossier racine :" without invisibles) as alias) as string -- 2
    	-- Récupération des sous dossiers de ce dossier
    	set Mes_Dossiers to (every folder of folder DossRacine) as alias list
     
     
    	-- boucle sur chaque sous dossier
    	repeat with Mon_Dossier in Mes_Dossiers
    		set Nom_Dossier to name of Mon_Dossier as string
     
    		-- boucle sur chaque fichier du sous dossier
    		set Mes_Fichiers to every file of the folder Mon_Dossier
    		repeat with Mon_Fichier in Mes_Fichiers
    			-- change le nom du fichier en nom-sous-dossier.nom-fichier
    			set the name of Mon_Fichier to Nom_Dossier & "." & name of Mon_Fichier
    		end repeat
     
    		-- mets tous les fichiers du sous dossier dans le dossier parent
    		move every file of entire contents of folder Mon_Dossier to folder DossRacine
    	end repeat
     
    	-- suppression de tous les dossiers du dossier principal
    	delete every folder of folder DossRacine
    end tell
    Tu ouvres l'Editeur AppleScript (dossier utilitaire) et tu copies/colles ce script dans le fenêtre de l'éditeur. Il s'exécute avec le bouton "Exécuter"...Simple comme le Mac. Non ?

    Cordialement

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 6
    Par défaut
    Merci beaucoup pour cette réponse !

    Il n'était juste pas la peine de renommer le fichier avec le nom du sous dossier car ils avaient déjà le même nom. J'ai retiré cette partie du code et cela fonctionne à merveille !

    Une petite question cependant... Est-il possible de descendre d'un niveau ? Je n'ai pas réussi à créer une boucle. Je m'explique:

    J'ai un dossier qui s'appelle 1. Ce dossier contient les dossiers 1.1, 1.2, ..., 1.5.
    Chacun de ces dossiers contiennent les dossiers 1.1.1, 1.1.2 et etc. pour les autres. Ce sont ces dossiers qui contiennent une seule image et elle porte le même nom que le dossier parent. Vu la grande quantité de dossier au niveau x.x.x j'aimerais pouvoir rajouter une itération pour donner en entrée à votre macro le niveau x.x et qu'il fasse ensuite le travail.

    Merci beaucoup !

  4. #4
    Membre émérite

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 606
    Par défaut Appels recursifs
    Bonjour "Oui Monsieur",
    Pour être franc, lorsque j'ai fait la première réponse, je me suis posé la question si tu étais limité à un seul niveau de sous dossier ou pas. Pour rester simple, j'ai supposé que c'était le cas et donc je n'avais pas à traiter les sous niveaux multiples...

    En fait tu cherches à traiter 3 niveaux. On pourrait modifier le script initial pour gérer ce 3ème niveau, mais je pense que cela pourrait servir à d'autres membres de ce forum d'avoir un nombre illimité de sous niveaux possibles.

    Pour ce faire, il faut faire appel à un concept au nom barbare, la "récursivité" souvent mal connue ou exploitée par de nombreux débutants. Je propose donc de l'utiliser ici, avec quelques d'explications (désolé pour la longueur de ces explications !).


    Imaginons un morceau de programme qui fait les tâches suivantes sur un dossier:
    1- Renomme tous les fichiers de ce dossier avec Nom = nom-dossier.nom-fichier
    2- Copie tous les fichiers renommés vers le dossier parent
    3- Efface tous les sous dossiers de ce dossier


    Ce morceau de programme reçoit 2 paramètres : le dossier à traiter et son dossier parent. Ce "morceau" s'appelle une sous routine (ou sous programme) qui, en AppleScript, est encadré par un bloc on / end
    Il fait exactement ce que faisait le premier script,...à un seul niveau de dossier.

    Maintenant, imaginons que j'ajoute une étape 0 à cette sous routine :
    0- Lister les sous-dossiers de ce dossier et ...pour chacun appeler cette sous-routine

    il en résulte que la sous-routine va s'appeler elle-même !! C'est ça la récursivité. Pour bien comprendre, il faut numéroter les niveaux d'appel.
    La routine est appelée par le programme principal (niveau 0), lorsque qu'elle s'appelle elle-même elle passe au niveau 1, dans lequel elle peut s'appeler elle-même (niveau 2) et ainsi de suite....
    La limite étant la mémoire disponible...autant dire pratiquement pas de limite avec les machines modernes !

    Exemple : dossier F qui contient dossiers A, B, C. A contient les dossiers A1,A2 et le dossier A1 contient A11 qui lui-même contient Photo.JPG

    La routine est appelée avec les paramètres A et F (le dossier et son parent) au niveau 0
    A l'étape 0, elle liste les sous dossiers de A (soit A1 et A2) et s'appelle elle-même (niveau 1) avec les paramètres A1 et A dans la première boucle, puis A2 et A dans la seconde boucle.
    Au niveau 1, la routine liste le sous dossier A11 à l'étape 0 et le traite en s'appelant de nouveau (niveau 2)
    Au niveau 2, la routine ne trouve pas de sous dossier dans A11, elle change le nom du fichier, le copie vers le dossier parent (A1)...et se termine ! Lorsque la routine se termine, elle remonte d'un niveau et revient donc au niveau 1, toujours à l'étape 0 pour traiter maintenant le dossier A2.
    Un fois tout terminée, elle revient au niveau 0...

    On a donc successivement les appels à la routine
    - niveau 0, paramètres A, F
    - Niveau 1, paramètres A1, A
    - Niveau 2, paramètres A11, A1
    - Niveau 1, paramètres A2, A
    - Niveau 0, paramètres B, F
    - Niveau 0, paramètres C, F

    Voici le code AppleScript correspondant (testé bien sûr !):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    -- bouge les fichiers des sous dossiers sur le dossier racine avec le nom sous-dossier.fichier
    tell application "Finder"
    	-- Selection du dossier principal
    	set DossRacine to ((choose folder with prompt "Choisissez le dossier racine :" without invisibles) as alias) as string -- 2
    	-- Récupération des sous dossiers de ce dossier
    	set Mes_Dossiers to (every folder of folder DossRacine) as alias list
    end tell
     
    -- boucle sur chaque sous dossier (c'est le niveau 0 !)
    repeat with Mon_Dossier in Mes_Dossiers
    	Nettoie_Dossier(Mon_Dossier, DossRacine)
    end repeat
    tell application "Finder" to delete every folder of folder DossRacine
    -- fin du programme principal
     
     
    -- Sous routine appelée par récursivité
    -- Argument : le dossier à netttoyer et le dossier parent
    on Nettoie_Dossier(Le_Dossier, Le_Dossier_Parent)
    	-- appel récursif de cette sous routine pour chacun des sous dossiers
    	tell application "Finder" to set Liste_Sous_Dossiers to (every folder of folder Le_Dossier) as alias list
    	repeat with Un_sous_Dossier in Liste_Sous_Dossiers
    		Nettoie_Dossier(Un_sous_Dossier, Le_Dossier)
    	end repeat
     
    	-- tous les sous dossiers ont été nettoyés : le dossier en cours contient des fichiers et des sous dossiers vides!
    	tell application "Finder"
    		set Nom_Dossier to name of Le_Dossier as string
     
    		-- boucle sur chaque fichier du dossier
    		set Mes_Fichiers to every file of the folder Le_Dossier
    		repeat with Mon_Fichier in Mes_Fichiers
    			-- change le nom du fichier en nom-dossier.nom-fichier
    			set the name of Mon_Fichier to Nom_Dossier & "." & name of Mon_Fichier
    		end repeat
     
    		-- mets tous les fichiers du dossier dans le dossier parent
    		move every file of entire contents of folder Le_Dossier to folder Le_Dossier_Parent
    		-- suppression de tous les sous dossiers du dossier en cours
    		delete every folder of folder Le_Dossier
    	end tell
    end Nettoie_Dossier

    Quelques remarques pour finir :
    1. La sous routine "Nettoie_Dossier" est le bloc de programme entre le On Netttoie_Dossier et le End Nettoie_Dossier.
    2. Les arguments sont entre parenthèses
    3. Faire bien attention au nom des variables (pour éviter les mélanges entre les variables du programme principal et celles de la sous routine)
    4. AppleScript n'aime pas les appels aux sous routines dans des bloc "Tell / End tell". C'est la raison pour laquelle les blocs tell "Finder" sont fermés avant appel à la routine et ré-ouvert après
    5. Ce programme a cependant une limite :celle de la taille du nom des fichiers ! Si chaque sous dossier a un nom de 10 caractères, et que la récursivité s'applique sur 10 niveaux de sous dossiers, les fichiers auront un nom trop long (10 fois (10 caractères + le point) = 110 caractères!). J'ai supposé que cela ne se produirait pas !

    Voilà ! La récursivité est un outil extrêmement puissant, et j'espère que vous saurez maintenant l'utiliser...

    Bonne journée

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 6
    Par défaut
    Merci beaucoup pour cette réponse très claire !

    J'avais inconsciemment et sans réussite essayé de créer une récursivité et votre macro tourne parfaitement, encore merci !

Discussions similaires

  1. déplacer des objets en grand nombre
    Par Speed41 dans le forum Delphi
    Réponses: 17
    Dernier message: 24/01/2015, 19h21
  2. Déplacer un grand nombre de movie clip
    Par bomberwaterman dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 22/06/2010, 13h39
  3. requete sql sur un grand nombre d enregistrement
    Par marielaure dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/08/2004, 11h53
  4. Traitement d'un grand nombre de champ
    Par k-lendos dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/03/2004, 15h13
  5. Une unité pour gérer des très grands nombres
    Par M.Dlb dans le forum Langage
    Réponses: 2
    Dernier message: 09/09/2003, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo