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 :

renommer un fichier d'après une liste


Sujet :

AppleScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 3
    Points
    3
    Par défaut renommer un fichier d'après une liste
    Bonjour à tous,

    J'ai des fichiers .pdf , .jpg , .psd que je souhaite renommer d'après une liste faite dans un tabler type Excel ou Number, que j'ai appelé nouveaunom. Mon tabler comprend 2 colonnes :
    • colonne 1: ancien nom ,
    • colonne 2 : nouveau nom


    L'idée du script est de renommer mon fichier avec le nouveau nom de la colonne 2.

    J'ai plusieurs fichiers à traiter donc je pense q'une boucle est nécessaire.

    D'avance merci pour ceux qui prendront le temps de se pencher sur ma demande.

    Bonne journée.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    En principe ce site est plutôt une aide pour ceux qui sont bloqués sur une partie de programme, que un site de demandes gratuites de développement.
    Ceci étant ta demande pourrait être simple, si elle était précise.

    Boucler sur les lignes d'un fichier Excel est simple et rapide, mais il manque des informations sur les noms de fichiers dans tes colonnes Excel :

    Est-ce que tous les fichiers sont dans un même dossier ?
    La première colonne du tableau Excel contient-elle seulement le nom actuel du fichier ? avec son chemin ? avec son extension ?
    Mêmes questions pour la seconde colonne.

    Enfin si l'une ou les 2 colonnes contiennent le chemin, dans quel format est exprimé ce chemin ?
    - Format Finder -> HD:Users:tonUserocuments:tonDossier:le_fichier.jpg
    - Format Unix -> HD/Users/tonUser/Documents/tonDossier/le_fichier.jpg

    Cordialement

  3. #3
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour ton retour, je ne souhaite pas qu'une personne me fasse le programme mais juste avoir des pistes ensuite je chercherai.

    Pour répondre a tes questions: Les fichiers sont dans 2 dossiers séparés un ancien_nom et l'autre nouveau_nom.
    La première et 2ème colonne ne contiennent que le nom du fichier et son extension.

    En cherchant un peu mon fichier excel je l'ai converti en txt, qui me donne un nom de fichier(ancien) séparé d'un espace avec le nouveau nom de fichier, ensuite à la ligne suivante j'ai la même chose pour un autre nom de fichier et ainsi de suite. A ce jour mon code est celui-çi mais cela fonctionne que pour le 1er fichier, ensuite ça bug et je cale...
    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
    43
    44
    45
    46
    47
    48
     
    tell application "Finder"
    	set cheminsource to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à copier"
    	set chemincible to choose folder with prompt "Sélectionnez le dossier cible"
    	set laliste to choose file with prompt "Sélectionnez le fichier liste"
    	my inspecter(cheminsource, chemincible, laliste)
    end tell
     
    on inspecter(source, cible, liste1)
     
    	set dossiersource to source as string
    	set dossiercible to cible as string
     
     
    	open for access liste1
    	read liste1
    	set tout_le_fichier to the result
    	close access liste1
    	set AppleScript's text item delimiters to (ASCII character 13)
    	set toutes_les_lignes to (every text item of tout_le_fichier) as list
    	set AppleScript's text item delimiters to ""
    	set tout_le_fichier to ""
     
     
    	repeat with une_ligne in toutes_les_lignes
     
    		set AppleScript's text item delimiters to (ASCII character 9)
    		set part1 to (every text item of une_ligne) as list
    		set lefichier to item 1 of part1
    		set lenew to item 2 of part1
    		set AppleScript's text item delimiters to ""
     
    		set CheminImage to dossiersource & lefichier --& ".jpg" -- si extension pas dans fichier texte et = .jpg
    		set newchemin to dossiercible & lefichier --& ".jpg" -- si extension pas dans fichier texte et = .jpg
    		set controle to CheminImage as string
     
    		tell application "Finder"
    			if exists controle then
    				-- duplique et renomme
    				duplicate CheminImage to dossiercible
    				set anciennom to (a reference to file newchemin)
    				set name of anciennom to lenew --& ".jpg" -- si extension pas dans fichier texte et = .jpg
    			else
    				display dialog "le fichier " & controle & " n'existe pas "
    			end if
    		end tell
    	end repeat
    end inspecter

    Bonne soirée.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Attention lorsque tu passes via un fichier texte : Supposer qu'un espace entre les 2 noms est suffisant implique que les noms ne contiennent aucun espace...
    Je préfère garder un fichier Excel, d'autant plus qu'il se lit très facilement avec Applescript et Excel.

    Voici un script qui devrait répondre à ta demande :

    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
    -- déplace les noms des fichiers de la colonne 1 avec les noms de la colonne B dans un autre dossierset ExcelFile to choose file with prompt "Selectionner le fichier Excel avec les correspondances"
    tell application "Microsoft Excel"
    -- Le fichier Excel contient 2 colonnes, l'un avec le nom actuel et l'autre avec le nouveau nom
    openExcelFile
        tell active sheet to set myData to value of used range
    close window 1
    -- myData est une liste dont chaque élément contient 2 items
    end tell
    
    -- selection du dossier avec les fichiers à modifier
    set Source to choose folder with prompt "Selectionner le dossier des fichiers à renommer"
    set USource to {POSIX path of Source}
    set Destination to choose folder with prompt "Selectionner le dossier des nouveaux fichiers"
    set UDest to {POSIX path of Destination}
    
    repeat with myRow in myData-- boucle sur chaque ligne            
        set curPath to quoted form of (USource & (item 1 of myRow)) -- Chemin et ancien nom complet format Unix
        set newPath to quoted form of (UDest & (item 2 of myRow)) -- Chemin et nouveau nom complet format Unix
        try -- Pour eviter l'erreur si le fichier n'est pas trouvé
            do shell script "find " & curPath & " -exec mv {} " & newPath & " ';'"
        end try
    end repeat -- ligne Excel suivante
    J'ai mis beaucoup de commentaires pour que tu puisse l'adapter.

    Explications sur la ligne Do Shell Script :
    - Le problème, en utilisant la fonction Applescript standard move ou copy est que l'on ne peut changer le nom du fichier en même temps.
    - J'utilise donc la fonction Unix 'mv' (move) en lui donnant le chemin/nom actuel et le chemin/nom futur.
    - J'appelle cette fonction mv en lui donnant comme argument source le résultat de la fonction 'find' qui recherche un fichier. Si le ficher est trouvé le 'find' le renvoie comme paramètre pour l'instruction 'mv'.
    - Enfin les fonctions Unix demandent d'utiliser les chemins avec des '/', d'où la conversion via 'POSIX path'. La fonction 'quoted form' est là pour ajouter des guillemets simples permettant d'utiliser des noms de dossier ou fichier avec des espaces sans que Unix ne les interprète comme des paramètres séparés.

    j'ai rapidement testé avec un exemple simple et le script fonctionne chez moi.

    Cordialement

  5. #5
    Candidat au Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Octobre 2019
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Un énorme merci pour ton retour avec toutes les explications qui me permettent de tout comprendre et d'évoluer.
    Tout fonctionne c'est parfait.
    Excellente journée.

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 433
    Points : 43 062
    Points
    43 062
    Par défaut
    Regardes du coté de File Buddy, si ça existe encore.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Candidat au Club
    Homme Profil pro
    Photographe
    Inscrit en
    Octobre 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Photographe
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Octobre 2019
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Ce post m'intéresse énormément.
    Je voudrais pousser le code un peu plus loin.
    Est il possible de renommer ces fichiers avec le nouveau et d'y inclure l'heure de création (capture de l'image dans les EXIF) à la suite au format :
    Nomdufichier_année_mois_Jour_Heure-Minutes-secondes.jpg
    Et de les classer automatiquement dans des dossiers comportant le Nomdufichier sans l'extension et l'heure de capture?

    J'avais la même chose sous batch windows mais gros point négatif.
    - Je travaille beaucoup plus sur Mac et je ne veux pas avoir un PC sous la main juste pour cela


    Du coup avoir un applescript exécutable sous mac est vraiment une solution en or
    Merci pour vos lumières.

    Voici le code du batch que j'utilisais
    Code Batch : 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
    @echo off
    setlocal enabledelayedexpansion
     
    REM Pour chaque ligne dans le fichier images.txt
    for /F "tokens=1,2 delims=;" %%a in (images.csv) do (
    	REM %%~a : Contient le nom du fichier de l'image
    	REM %%~b : Contient le nom de la personne
     
    	REM Si le fichier de l'image existe
    	if exist "%%~a" (
    		REM RÈcupËre les informations (date et extension) de l'image
    		for %%c in (%%a) do (
    			REM %%~tc : Contient la date non formater
    			REM %%~xc : Contient l'extension du fichier
     
    			REM Formatage de la date
    			set date_tmp=%%~tc
    			set date_tmp=!date_tmp:~6,4!_!date_tmp:~3,2!_!date_tmp:~,2!_!date_tmp:~11,2!-!date_tmp:~14,2!-!date_tmp:~6,2!
    			REM !date_tmp! : Contient la date formatÈe
     
    			REM Si le dossier cible (personne) n'existe pas on le crÈe
    			if not exist "%%~b\" md "%%~b"
     
    			REM Effectue la copie dans le dossier persone correcpondand et renomme le fichier (/Y pour Ècraser si besoin)
    			copy "%%~a" "%%~b\%%~b_!date_tmp!%%~xc" /Y > nul
    		)
    	)
    )
    pause

  8. #8
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    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 : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir Oliv91,
    Effectivement on peut aller plus loin avec Applescript (ou avec du shell bash).

    Il faut d'abord décomposer les tâches à effectuer:
    1) faire une liste de fichiers à traiter (déjà inclus dans le premier script)
    2) prendre la liste Excel et boucler sur chaque nom de fichier (aussi inclus précédemment)
    3) renommer le fichier
    4) déplacer le fichier vers un dossier adéquat (script précédent)

    Pour renommer le fichier, tu souhaites ajouter au nom du fichier la date de prise de vue à partir des données Exifs sous le format AAAA_MM_JJ-hh-mm-ss
    Il faut d'abord extraire les données Exif de ton fichier Photo. Pour cela je connais 2 méthodes (il y en a sûrement d'autres !): utiliser l'application Image Events ou l'utilitaire Exif tool.


    Je suis un grand adepte de Exif tool (merci à Phil Harvey) qui est un utilitaire gratuit de traitement des photos (et plus !) en ligne de commande. Je l'utilise pour lire/écrire les dates, faire des tris par appareil de prise de vue, ajouter/lire des mots clés et plein d'autres choses. C'est un véritable couteau suisse des Exif tag sur Mac en ligne de commande avec des dizaines d'options et de commandes.
    Il suffit de le télécharger (recherche exiftool Mac sur Google) et il s'installe pour être directement disponible en ligne de commande. Une fois installé taper dans le Terminal la commande exiftool -h qui affiche l'aide. Cela vous confirmera que l'on peut tout faire à propos des exif tag, y compris des traitements en masse très rapides.

    Par exemple dans le Terminal la commande exiftool -CreateDate /Users/Me/Desktop/monImage.jpg
    donne la date Exif de creation avec le format AAAA:MM:JJ hh:mm:ss.
    il est aussi possible d'extraire la date originale avec la commande exiftool -DateTimeOriginal
    Il suffit de convertir les ':' en '_' et le tour est joué.
    Note importante : sous Applescript, l'appel à exiftool doit specifier le chemin de la commande dans le do shell script : dans mon cas c'est /usr/local/bin/exiftool -DateTimeOriginal



    Il est aussi possible d'utiliser l'utilitaire Apple Image Events. Ne cherchez pas cette utilitaire en tant qu'application, c'est une bibliothèque de traitement d'image via Applescript.
    Par exemple le script ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            tell application "Image Events"
                set Local_Image to open Local_Fichier
    -- set L_Date_S to (valeur du metadata tag "creation" de Local_Image)
                copy (value of metadata tag "creation" of Local_Image) to L_Date_S
    close Local_Image
            end tell
    renvoie dans la variable L_Date_S une string avec date et heure du fichier Local_Image.
    Si Image Events est parfois plus simple que Exiftool, le principal défaut que je lui trouve est sa lenteur (on doit ouvrir le fichier image) et il n'est pas aussi puissant pour les exif tags.



    Il reste, dans les 2 cas, à formatter la date/heure selon notre souhait.
    Pour ce faire, il faut utiliser les Applescript text delimiters. C'est une méthode de coupure de texte selon des séparateurs. Ce que fait Excel lorsque qu'il passe d'un texte à une liste de colonnes, mais ici le séparateur peut être un caractère, un mot, une phrase !
    Je suppose que le point de départ est le résultat de la commande Exif qui renvoie la date de creation, ci-dessous dans la variable ExifResult.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    set ExifResult to "Create Date                     : 2013:01:26 19:19:51"
    set ExifResult to text 35 thru -1 of ExifResult
    
    set AppleScript'stext item delimiters to {":"}
    set liste to text items of ExifResult
    set AppleScript'stext item delimiters to {"_"}
    set maDate to liste as string
    On commence par supprimer les 35 premiers caractères. On indique ensuite à Applescript que l'on souhaite couper le texte avec le séparateur ":", puis on le reconstitue avec le séparateur "_" dans la variable maDate.
    Je te laisse le soin d'imaginer la suite pour remplacer l'espace entre date et heure par -, voir entre les heures-minutes-secondes en utilisant les mêmes techniques.

    J'espère t'avoir donné les premières pistes pour ton script.

    Cordialement

    PS : une question n'est jamais stupide. Seule la réponse peut l'être !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AppleScript] Copier des fichiers d'après une liste
    Par Pierkai dans le forum AppleScript
    Réponses: 1
    Dernier message: 26/04/2018, 22h09
  2. [AppleScript] Renommer des fichiers .jpg d'après une liste en désordre (avec concordance)
    Par MartiBoti dans le forum AppleScript
    Réponses: 11
    Dernier message: 14/03/2016, 23h19
  3. [XL-2010] Macro pour renommer des fichiers à partir d'une liste de nom de fichiers
    Par thomahh dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/01/2013, 17h03
  4. Suppression de fichiers d'après une liste
    Par Gardel dans le forum VBScript
    Réponses: 2
    Dernier message: 11/11/2010, 21h09
  5. Renommer un fichier inclue dans une liste
    Par Altaria dans le forum SharePoint
    Réponses: 4
    Dernier message: 20/08/2008, 17h43

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