# Sélectionner fichiers à partir d'une liste avec Automator



## Guillaume16 (23 Juin 2014)

Bonjour,

Je vous expose mon problème.
J'ai un dossier "MES PHOTOS" avec des milliers de photos avec des noms incrémentés du style :
photo-01.jpg
photo-02.jpg
photo-03.jpg
...

Et j'ai une liste excel (facilement convertible en .txt ou .doc...) avec une sélection de certaines photos du dossier "MES PHOTOS".
J'aimerai automatiser la sélection des fichiers .jpg de ma liste excel afin de pouvoir copier/coller cette sélection dans un autre dossier "MA SELECTION".

Comment puis-je m'y prendre avec Automator ?

Merci d'avance pour vos retours.


----------



## zeltron54 (24 Juin 2014)

Bonjour,

Avec automator je ne connais pas, mais réalisable avec un petit script applescript.


----------



## Guillaume16 (24 Juin 2014)

Ok zeltron54, et tu pourrais m'en dire plus afin que je puisse faire cette opération de manière automatique ?
Merci d'avance pour ton aide


----------



## zeltron54 (24 Juin 2014)

voila un petit script qui devrait fonctionner:
il faut enregistrer ta liste depuis excel au format : texte séparateur tabulation

le script te demandes de sélectionner le dossier source, puis le dossier cible, puis enfin le fichier liste,  puis il copie les fichiers de la liste de la source dans la cible.
Fait un copier, coller de ce script dans une fenêtre applescript. puis exécuter.

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 CheminImage to dossiersource & une_ligne
        tell application "Finder"

            duplicate CheminImage to dossiercible

        end tell
    end repeat
end inspecter
tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell



Edit: le fichier excel doit avoir une colonne "A", avec un nom de fichier par ligne .


----------



## Guillaume16 (24 Juin 2014)

Super, merci zeltron54 je teste ça dès ce soir  et je fais un retour


----------



## Guillaume16 (24 Juin 2014)

Tout fonctionne à merveille !!! merci zeltron54 !!!


----------



## zeltron54 (24 Juin 2014)

Content pour toi ! 

Pense à mettre résolu !


----------



## Guillaume16 (25 Juin 2014)

Heu c'est con, mais je ne sais pas où mettre cette discussion "Résolu"... Il y a un bouton pour cela ?


----------



## overdozz (2 Juillet 2018)

Bonjour à tous,
je me permet de déterrer ce vieux topic car je trouve ce script très pratique, cependant j'aurais une question :

J'utilise ce script dans un but un peu similaire mais contrairement à l'auteur j’ai besoin de faire cela avec des fois 50 listes différentes.
Pensez-vous qu'il serait possible de n'avoir qu'une seule liste, avec dedans toutes mes listes séparées par un symbole et qui ferait créer un nouveau dossier avec les fichiers correspondant à chaque changement de liste, reconnu par le symbole ?

exemple :

liste1 => création du dossier liste1 avec a1,a2 et a3 dedans
a1
a2
a3
$
liste 2 => création du dossier liste 2 avec a4,a5 et a6 dedans
a4
a5
a6
$
liste 3 création du dossier liste3 avec a7,... dedans
a7
...

Merci beaucoup et bonne soirée.


----------



## zeltron54 (2 Juillet 2018)

Bonjour, overdozz 

Pour adapter le script à tes besoins, il faudrait plus de détails sur ta situation actuelle et ce que tu veux obtenir.

- Tes fichiers sont ' ils actuellement tous dans le même dossier ?  avec ou sans sous-dossiers ?
- Ces fichiers doivent ' ils être déplacés ou dupliqués?
- les nouveaux dossiers seront à créer dans le dossier cible avec le nom qui sera dans la liste après le signe $ ?

Avec ces informations, je pourrai essayer d'adapter le script, dés que j'aurai un moment !


----------



## overdozz (2 Juillet 2018)

Bonjour Zeltron, tout d'abord merci beaucoup de ta réponse,

ensuite pour répondre à tes questions, mes fichiers sont effectivement dans des sous dossiers situés eux dans un seul dossier (dossier/sousdoussier1/a1.pdf , dossier/sousdoussier2/a2.pdf ).
Iil faut donc chercher dans tout le dossier principal. (mais ça au pire je peux le résoudre en sortant les fichiers de leur sous-dossier, c'est vraiment pas grave.)

Je dois donc les dupliquer dans le dossier cible avec en effet si possible le nom du dossier qui se trouve sur la première ligne (qui n'est pas un nom de fichier mais juste le nom de la liste)

Encore une fois merci beaucoup de ton aide, en te souhaitant une bonne soirée.


----------



## zeltron54 (2 Juillet 2018)

Autre précision, ta liste à bien les noms des fichiers avec leurs extension (.pdf ou.jpg   etc...)
Donc ta liste se présente comme ça:

$
dossier1
fich1.pdf
fich2.pdf
$
dossier2
fich3.pdf
fich4.pdf
fich5.jpg
$
dossier3
fich11.pdf
fich2222.jpg


ETC..

Peux-tu me confirmer la présentation, ou me dire exactement comment cela se présente.


----------



## overdozz (2 Juillet 2018)

En fait pour rentrer dans les détails, actuelement j'ai un tableau excel avec toutes les listes les unes à côté des autres, mais du coup pour ton script je copie chaque liste dans un fichier txt vierge.
Donc là en effet dans l'idée,  la présentation serait exactement comme ça, avec les extensions .pdf.

Je suis parti sur ça en pensant que c'était le plus facile à adapter, car je pense que exploiter directement mon tableau excel nécessite un travail colossal et qui n'a plus grand chose à voir avec ton script de base...


----------



## zeltron54 (2 Juillet 2018)

Ok je regarde pour adapter ça.


----------



## zeltron54 (2 Juillet 2018)

Une autre question: le nom du dossier dans la liste est il le même que celui dans le dossier source, sinon il faut tout revoir.
Car j'ai besoin du chemin complet du fichier pour le trouver et le dupliquer.


----------



## overdozz (2 Juillet 2018)

Alors si j'ai bien compris ta question  la réponse est non. 
Le nom en haut de la liste est là juste là pour pouvoir avoir un dossier avec le bon nom et s'y retrouvé entre les 50 listes. Mais après j'ai juste a choisir mon dossier source au début du script non ? J'espère avoir compris ta question !


----------



## zeltron54 (2 Juillet 2018)

J'ai fais un petit truc vite fait, qui fait le job.
Il faut bien sur que ton fichier liste corresponde au modèle que j'ai mis ci-dessus, notamment qu'il commence par un $ puis un nom de dossier.
Ce fichier doit bien sur être au format texte avec séparateur tabulation (enregistré depuis excel par exemple).

Ce script analyse ligne par ligne le fichier liste, s'il trouve un $, il se prépare pour utiliser la ligne suivante en tant que nom de dossier à créer, puis recherche dans le dossier source et ses sous dossier les fichiers de la liste jusqu'au prochain $ et duplique ces fichiers.

En espérant que cela te convienne , bon tests.


```
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
    set destination to dossiercible
   
    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 ""
   
    set nouveaudossier to 0 as integer
    set atraiter to 0 as integer
    repeat with une_ligne in toutes_les_lignes
               
        set letest to une_ligne as string
       
        if nouveaudossier = 1 then
            set dossiercible to dossiercible as string
            set ledossier to une_ligne as string
            tell application "Finder"
                make new folder at dossiercible with properties {name:ledossier}
            end tell
            set nouveaudossier to 0
            set destination to dossiercible & ledossier
        end if
       
        if letest = "$" then
            set nouveaudossier to 1
            set atraiter to 2
        end if
       
       
        if atraiter > 0 then
            set atraiter to atraiter - 1
           
        else
           
            set CheminImage to dossiersource & une_ligne
           
            set lefichier to do shell script "mdfind -onlyin " & quoted form of POSIX path of dossiersource & " " & une_ligne
            set CheminImage to POSIX file lefichier as string
           
            tell application "Finder"
               
                duplicate CheminImage to destination
               
            end tell
           
        end if
       
    end repeat
end inspecter

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## overdozz (3 Juillet 2018)

Pétard..., c'est exactement ça ! 
Alors là vraiment je te tire mon chapeau et te remercie sincèrement pour ton travail et ta réactivité.

Petite question sans vouloir abuser de ton temps, tu penses qu'il serait possible que le script continue même si il ne trouve pas un fichier et qu'il passe au suivant au lieu de s'arretter ?
Je te souhaite une bonne journée.
Encore merci Zeltron.


----------



## overdozz (3 Juillet 2018)

Après plusieurs test concluant sur certaine liste, j'obtiens ce message d’erreur : error "Impossible de convertir POSIX file \"\" of «script» en type string." number -1700 from POSIX file "" to string, or que j'ai bien vérifié que ma liste correspond exactement à mes fichiers... Il me créé juste le nouveau dossier avec le bon nom..., j'ai du mal à comprendre.
Que veux dire ce message ?
Merci à toi.


----------



## zeltron54 (3 Juillet 2018)

Le message d'erreur vient du fait qu'un nom de fichier ne peut pas être.
Soit le nom contient de caractères interdit
Soit ta liste n'est pas au bon format et le script prend plusieurs lignes pour une seule. Ceci arrive notamment si tu ajoutes un fichier à la main dans le fichier texte.

Pour la question continuer si fichier n'existe pas, je te met un nouveau script qui si le fichier n'existe pas crée un fichier log sur le bureau avec les nom de fichier pas trouvé.


```
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
    set destination to dossiercible
   
    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 ""
   
    set nouveaudossier to 0 as integer
    set atraiter to 0 as integer
    repeat with une_ligne in toutes_les_lignes
        set letest to une_ligne as string
        if nouveaudossier = 1 then
            set dossiercible to dossiercible as string
            set ledossier to une_ligne as string
            tell application "Finder"
                make new folder at dossiercible with properties {name:ledossier}
            end tell
            set nouveaudossier to 0
            set destination to dossiercible & ledossier
        end if
       
        if letest = "$" then
            set nouveaudossier to 1
            set atraiter to 2
        end if
        if atraiter > 0 then
            set atraiter to atraiter - 1
        else
            set CheminImage to dossiersource & une_ligne
            try
                set lefichier to do shell script "mdfind -onlyin " & quoted form of POSIX path of dossiersource & " " & une_ligne
                set CheminImage to POSIX file lefichier as string
                tell application "Finder"
                    duplicate CheminImage to destination
                end tell
            on error
                set lelog to open for access (path to desktop folder as text) & "lelog.txt" as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
                write "Le fichier " & une_ligne & " N'a pas été trouvé" & return to lelog starting at eof
                close access lelog -- ferme le fichier log
            end try
        end if
       
    end repeat
   
end inspecter

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## overdozz (3 Juillet 2018)

Ok bon j'ai trouvé, c'est quand j'ai des "=" dans mes nomenclatures que cela ne passe pas.
Je me suis pourtant basé sur le ASCII comme écrit dans ton code mais j'ai du me tromper..

penses-tu qu'il y est un moyen de prendre en compte ce symbole ? car il est présent dans les 3/4 de les fichiers.

En tout cas ta maj pour le log est parfaite, c'est exactement ce que j'avais besoin.

Encore merci. Vraiment.


----------



## zeltron54 (3 Juillet 2018)

Que veux-tu dire par "c'est quand j'ai des "=" dans mes nomenclatures" peux-tu mettre une exemple
C'est dans les noms de fichiers ?


----------



## overdozz (3 Juillet 2018)

En gros, des fois j'ai des fichier qui se nomment "21159_P02_PVhard_MF.pdf" et des fois "22959_P01_V4=GV=hard_F42.pdf"
J'ai fais des tests, le premier passe contrairement au deuxième, et quand je change le premier en "21159_P02_PVhard=1_MF.pdf", il n'est plus trouvé.
Donc pour moi c'est le signe = qui n'a pas l'air d'être reconnu... c'est possible ?


----------



## zeltron54 (3 Juillet 2018)

Effectivement , je viens de tester, le signe "=" n'est pas reconnu par le terminal unix comme un caractère possible d'un nom de fichier !
Pour le moment je n'ai pas de solution à ce problème à part remplacer tous les signes "=" par un autre caractère.


----------



## overdozz (3 Juillet 2018)

Ok ok, je vais chercher de mon côté car malheureusement dans ma config je peux difficilement envisager de remplacer ce caractère de mes fichiers..
Merci à toi.


----------



## zeltron54 (3 Juillet 2018)

Voilà une nouvelle version qui prend en compte le signe "=" et de plus j'ai modifié la recherche pour qu'elle soit insensible à la casse.
Bon test, j' attend tes résultats.


```
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
    set destination to dossiercible
   
    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 ""
   
    set nouveaudossier to 0 as integer
    set atraiter to 0 as integer
    repeat with une_ligne in toutes_les_lignes
        set letest to une_ligne as string
        if nouveaudossier = 1 then
            set dossiercible to dossiercible as string
            set ledossier to une_ligne as string
            tell application "Finder"
                make new folder at dossiercible with properties {name:ledossier}
            end tell
            set nouveaudossier to 0
            set destination to dossiercible & ledossier
        end if
       
        if letest = "$" then
            set nouveaudossier to 1
            set atraiter to 2
        end if
        if atraiter > 0 then
            set atraiter to atraiter - 1
        else
            try
                tell application "Finder"
                    set lefichier to do shell script "find  " & quoted form of POSIX path of dossiersource & " -iname " & une_ligne
                    set CheminImage to POSIX file lefichier as string
                   
                    duplicate CheminImage to destination
                end tell
            on error
                set lelog to open for access (path to desktop folder as text) & "lelog.txt" as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
                write "Le fichier " & une_ligne & " N'a pas été trouvé" & return to lelog starting at eof
                close access lelog -- ferme le fichier log
            end try
        end if
       
    end repeat
   
end inspecter

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## overdozz (4 Juillet 2018)

Alors là.. bravo c'est exactement ce que j'avais besoin ! Tu viens de me faire gagner de précieuses heures au quotidien, je te dois beaucoup !
Merci beaucoup Zeltron.


----------



## zeltron54 (4 Juillet 2018)

Content pour toi !


----------



## choux (17 Septembre 2018)

Bonjour,
J'ai le même besoin que Guillaume16 pour le boulot. Je dois réaliser un dossier qui compile une copie de fichiers pdf.
J'ai testé le script proposé par Zeltron54 au début du post mais ça ne marche pas, j'obtiens : 
"Erreur dans Finder : Le gestionnaire ne peut gérer des objets de cette classe." number -10010

Le top du top serait que la recherche puisse se faire dans un dossier et ses sous dossiers, est-ce possible ?

Merci d'avance pour votre aide


----------



## zeltron54 (17 Septembre 2018)

Bonjour,
Peux-tu préciser le contexte, (un dossier qui compile une copie !! ??)
Dis exactement ce que tu as (dossiers, fichiers, liste) et ce que tu veux obtenir quoi  et où ?
On pourra regarder ce qu'il est possible de faire..


----------



## choux (17 Septembre 2018)

En fait j'ai une liste contenant les noms des fichiers que je souhaites copier (fichier Excel enregistré au format texte, séparateur, tabulation)
Les fichiers que je souhaite copier sont des pdf, il sont répartis dans différents sous dossiers.

Je voudrais faire une copie, dans un nouveau dossier, des fichiers spécifiés dans la liste.

(Quand je parle de compiler, je veux dire rassembler)
J'espère avoir été plus claire.
Merci pour ton aide


----------



## Membre supprimé 1129907 (17 Septembre 2018)

Dans ta liste, as-tu le nom des répertoires contenant les fichiers à copier ?
Peux-tu nous lettre un exemple de fichier texte contenant la liste à traiter ?

Merci


----------



## choux (17 Septembre 2018)

Non, je n'ai pas le nom des répertoires mais je peux facilement les intégrer.
Je n'arrive pas à vous transmettre le fichier liste au au format texte, séparateur, tabulation (le site m'en empêche), je met une copie d'écran.




Si besoin, je peux facilement adapter ce fichier, je part d'un export Excel de mon ERP.


----------



## Membre supprimé 1129907 (17 Septembre 2018)

Ok, donc la tabulation comme séparateur mais il n’y a qu’une seule colonne. Cette colonne contient le nom des fichier sans le nom du répertoire.

Il faudra donc retrouver le répertoire contenant le fichier et le copier/déplacer dans un autre donné en paramètre ou forcé.


----------



## zeltron54 (17 Septembre 2018)

Je te joins un script qui fera le job.
Au lancement il te demande de choisir
-le dossier source qui contient tous les sous dossiers et les fichiers à rechercher.
-le dossier destination dans lequel seront dupliqués les fichiers .pdf trouvés.
-la liste texte des fichiers à dupliquer.

Il déplace tous les fichiers trouvés et crée sur le bureau un fichier log des fichiers de la liste non trouvés

Dis moi si ça te conviens.


```
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
    set destination to dossiercible
   
    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
       
        try
            tell application "Finder"
                set lefichier to do shell script "find  " & quoted form of POSIX path of dossiersource & " -iname " & une_ligne & ".pdf"
                set CheminImage to POSIX file lefichier as string
               
                duplicate CheminImage to destination
            end tell
        on error
            set lelog to open for access (path to desktop folder as text) & "lelog.txt" as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
            write "Le fichier " & une_ligne & " N'a pas été trouvé" & return to lelog starting at eof
            close access lelog -- ferme le fichier log
        end try
       
    end repeat
   
end inspecter

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## choux (17 Septembre 2018)

Merci pour vos réponses, 
Zeltron54 je viens de tester ton script, effectivement il fait le job mais bizarrement seulement avec premier fichier de la liste, le log indique que les autres n'ont pas été trouvés

J'ai testé de chez moi et je n'ai pas le même OS qu'au bureau, je ne sais pas si ça change quelque chose, je réessaierais demain matin sur mon mac du boulot.


----------



## zeltron54 (17 Septembre 2018)

Non l'OS ne change rien, par contre la liste doit être issue d'un enregistrement excel au format texte (séparateur : tabulation)  et pas de ligne vide.
Un autre solution pourra éventuellement être mise en oeuvre avec un fichier texte ordinaire ou les titres seraient séparés par des virgules, il suffirait alors de faire une petite modification au script.


----------



## choux (17 Septembre 2018)

Alors c'est peut être ma liste le problème.
Comme je n'ai pas Excel à la maison, je suis partie d'une liste faite dans Google Sheets enregistrée au format .tsv
Je reteste demain matin dans de bonnes conditions et je vous tiens au courant.

En tout cas merci pour votre aide


----------



## zeltron54 (17 Septembre 2018)

Ok, j'attend le verdict....


----------



## zeltron54 (17 Septembre 2018)

Après réflexion, j'ai modifié le script pour qu'il prenne en compte les fichiers texte, ligne par ligne, que celui-ci soit issu d'excel ou directement d'un fichier texte. celà devrait facilité son utilisation.
j'attends le résultat de tes essais .


```
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
    set destination to dossiercible
   
    open for access liste1
    read liste1
    set tout_le_fichier to the result
    close access liste1
    set nb to count paragraph of tout_le_fichier
   
    repeat with i from 1 to nb
        try
            tell application "Finder"
                set une_ligne to paragraph i of tout_le_fichier
                set lefichier to do shell script "find  " & quoted form of POSIX path of dossiersource & " -iname " & une_ligne & ".pdf"
                set CheminImage to POSIX file lefichier as string
               
                duplicate CheminImage to destination
            end tell
        on error
            set lelog to open for access (path to desktop folder as text) & "lelog.txt" as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
            write "Le fichier " & une_ligne & " N'a pas été trouvé" & return to lelog starting at eof
            close access lelog -- ferme le fichier log
        end try
    end repeat
end inspecter

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## choux (18 Septembre 2018)

Hello Zeltron54, tu es un as !
C'est parfait, ton dernier script fonctionne à merveille.
Tu viens de me faire gagner 1 heure de paperasse par production !

Merci beaucoup !

Tu connais un bon site ou un bon bouquin qui détaillerais bien le langage Applescript ?
Je comprend bien la logique, mais il me manque le vocabulaire et j'aimerais pouvoir automatiser plein d'autres tâches pour le boulot.

En tout cas, merci encore pour ton aide !


----------



## zeltron54 (18 Septembre 2018)

Content pour toi.
Pour apprendre, il y a quelques sites (pour débuter) et des forums de développeurs, pas de bouquins récents à ma connaissance.


----------



## lydy (7 Août 2019)

zeltron54 a dit:


> voila un petit script qui devrait fonctionner:
> il faut enregistrer ta liste depuis excel au format : texte séparateur tabulation
> 
> le script te demandes de sélectionner le dossier source, puis le dossier cible, puis enfin le fichier liste,  puis il copie les fichiers de la liste de la source dans la cible.
> ...



Bonjour, je relance ce vieux sujet en espérant que j'obtienne une réponse 

voilà j'ai le même problème, j'ai une liste de photo, un dossier photos (contenant plusieurs photos dont celle de la liste) , et je souhaiterais que seul les photos de la liste soit copiées dans un autre dossier. J'ai essayé de recopier le script ci-dessus, mais sa ne fonctionne pas, je dois surement mal faire quelques choses.

y'a-t-il une subtilité à faire que je connais pas ?

merci d'avance de vos retours !


----------



## zeltron54 (7 Août 2019)

@lydy
Bonsoir,
Le script du message #40 devrait fonctionner. si ce n'est pas le cas, dis exactement ce que tu fais, ce que tu obtiens, et ce qui ne fonctionne pas.
Détaille ton problème qu'on essaie de voir ce qui pêche chez toi...

Édit. Le script a été fait pour des fichiers dont l’extension est .PDF   Donc il faudra l’adapter à ton cas. Est ce que ta liste des noms inclu l’extension ou pas ?


----------



## zeltron54 (8 Août 2019)

@lydy 
D'après ton autre message  https://forums.macg.co/threads/recherche-automatique-de-photos-via-une-liste.1318789/#post-13460635
ta liste contient le nom avec l'extension donc ce script devrait faire le job.
Au lancement il te demande de sélectionner le dossier source (il peut contenir les photos et des dossiers contenant eux même des photos...), puis de sélectionner le dossier destination (dans lequel seront dupliquées les photos), puis la liste (au format texte , 1 photo par ligne)
et il n'y a plus qu'a attendre le message de fin. si une ou des photos de la liste ne sont pas trouvées, un fichier lelog.txt est créé sur le bureau contenant la liste des photos non trouvées.

Dis moi si cela fonctionne ou quel est le problème.


```
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
    set destination to dossiercible
   
    open for access liste1
    read liste1
    set tout_le_fichier to the result
    close access liste1
    set nb to count paragraph of tout_le_fichier
   
    repeat with i from 1 to nb
       
        try
            tell application "Finder"
                set une_ligne to paragraph i of tout_le_fichier
                set lefichier to do shell script "find  " & quoted form of POSIX path of dossiersource & " -iname " & une_ligne
                set CheminImage to POSIX file lefichier as string
                duplicate CheminImage to destination
            end tell
        on error
            set lelog to open for access (path to desktop folder as text) & "lelog.txt" as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
            write "Le fichier " & une_ligne & " N'a pas été trouvé" & return to lelog starting at eof
            close access lelog -- ferme le fichier log
        end try
    end repeat
end inspecter

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## lydy (8 Août 2019)

zeltron54 a dit:


> @lydy
> D'après ton autre message  https://forums.macg.co/threads/recherche-automatique-de-photos-via-une-liste.1318789/#post-13460635
> ta liste contient le nom avec l'extension donc ce script devrait faire le job.
> Au lancement il te demande de sélectionner le dossier source (il peut contenir les photos et des dossiers contenant eux même des photos...), puis de sélectionner le dossier destination (dans lequel seront dupliquées les photos), puis la liste (au format texte , 1 photo par ligne)
> ...




Merci !! ça fonctionne ! tu n'imagines pas à quel point tu vas faciliter mon labeur de recherche de photo !

2 petites questions si possible :
- si dans mon dossier source (ou je vais chercher mes images) il y a plusieurs fois la même image avec des extensions différentes, le script ira bien me chercher uniquement l'extension que j'ai renseigné dans la liste ?

 si je veux chercher autre chose que du .psd  quelle partie du code dois-je changer ?


----------



## zeltron54 (8 Août 2019)

Si plusieurs fois la même image avec des extensions différentes elles seront traitées comme des images différentes et ne seront dupliquées que celles présentent dans la liste (nom + extension).

Dans le script que je t'ai données il prend tous les fichiers de ta liste avec l'extension renseignées donc si c'est autre chose que des images pas de problème pourvu que ta liste contienne bien le nom du fichier avec son extension.


----------



## aminjat (3 Février 2020)

bonjour

je pense que cette base de script peut m'être très utile pour me faire gagner un temps fou sur un projet

voila mon projet :
j'ai une liste excel de sites (lieu) qui porte un nom, un code postal et un numero d'identification

j'aimerais via cette liste créer un nombre de dossier équivalent du type "CP-NOM-NUMERO"
il faudrait que ces dossiers soit la copie d'un dossier type et que les nom de fichier soit modifier en même temps 

exemple : 

DOSSIER TYPE
          - FICHIER XLS
          - FICHIER DOC
          - ect ...

_dossier créé > _69100-VILLEURBANNE SUD-123455
          - 123455-VILLEURBANNE SUD.XLS
          - 123455-VILLEURBANNE SUD.DOC
          - ect ...

Pouvez-vous m'aider ?


----------



## zeltron54 (4 Février 2020)

Bonjour,

J'ai beaucoup de mal à comprendre exactement ton besoin.

Tu veux créer un hiérarchie de dossiers qui porterons le nom qui est à récupérer dans une liste excel  c'est bien ça ???

Tu parles de Dossier type ?? et, de plus, dans ton exemple "dossier créé" les noms de dossiers ont des noms de fichiers (avec une extension  .xls    .doc) ??

Si tu peux préciser ton projet, on pourra regarder pour établir un script.


----------



## baron (4 Février 2020)

J'imagine plutôt que pour chaque commune/projet, il faut créer un dossier contenant des fichiers xls et doc à remplir ultérieurement, créés à partir d'un document-type (ou un modèle) et placés dans le dossier.
Le dossier et les fichiers qu'il recèle porteront chacun un nom adapté.

La solution imaginée par aminjat était de faire un dossier (type) contenant les deux fichiers, vierges mais déjà mis en forme, de copier le tout pour chaque ligne du tableur et de renommer chaque fois les trois éléments.


----------



## zeltron54 (4 Février 2020)

@baron  

Ok je comprend mieux, je vais attendre sa confirmation, et regarderai ça dès que j'aurai un moment.


----------



## aminjat (4 Février 2020)

baron a dit:


> J'imagine plutôt que pour chaque commune/projet, il faut créer un dossier contenant des fichiers xls et doc à remplir ultérieurement, créés à partir d'un document-type (ou un modèle) et placés dans le dossier.
> Le dossier et les fichiers qu'il recèle porteront chacun un nom adapté.
> 
> La solution imaginée par aminjat était de faire un dossier (type) contenant les deux fichiers, vierges mais déjà mis en forme, de copier le tout pour chaque ligne du tableur et de renommer chaque fois les trois éléments.




tu n'aurait pas pu mieux l'expliquer que ça


----------



## zeltron54 (4 Février 2020)

Bonsoir,

Il faudrait savoir comment est cette liste excel , 3 colonnes , dans quelles ordre, et dans quel ordre construire le nom du dossier, et des fichiers.

L'idéal sera d'enregistrer ce fichier au format texte séparateur tabulation.

Au vu des ces infos je pourrai te faire un petit script.


----------



## aminjat (4 Février 2020)

il faudrait que le nom de dossier et de fichier soit équivalent a : NUMERO - NOM - CP 
je peut créer le fichier txt via excel en le mettant en forme dans le sens qu'il faut ( il est déja sur plusieurs colonnes ) 

est-ce que quelque chose comme cela pourrait aller ? 

N° SS;NOM STATION;CP
9505;MARSEILLE ROCHES;13007
9441;MARSEILLE CLOT BEY;13008
9511;MARSEILLE LOUP;13011
9434;MARSEILLE ST JUST;13013
9513;MARSEILLE MARTHE;13014
9430;MARSEILLE ANTOINE;13015


----------



## zeltron54 (4 Février 2020)

Alors pas de problème si c'est ce qui t'arranges, je pensais plus à un séparateur comme une tabulation, mais un point virgule ira très bien.
Le fichier texte ne devra pas avoir la première ligne (nom des champs)


Donc le nom du dossier sera:
9505_MARSEILLE ROCHES_13007
etc...

Ok je te fais ça


----------



## aminjat (4 Février 2020)

ca serait parfait


----------



## zeltron54 (4 Février 2020)

Lors du lancement du script il te demande de sélectionner le dossier type, puis le dossier vierge dans lequel sera construit la structure par copie du dossier type, puis enfin le fichier texte de la liste.

Il suffit de patienter, il affiche une boite de dialogue lorsque c'est fini. Il ne touche en aucun cas aux fichiers originaux.

Dis moi si ça fonctionne comme tu veux !


```
Tell application "Finder"
    set cheminsource to choose folder with prompt "Sélectionnez le dossier type à reproduire"
    set chemincible to choose folder with prompt "Sélectionnez le dossier cible dans lequel sera créé la structure"
    set laliste to choose file with prompt "Sélectionnez le fichier liste"
    
    open for access laliste
    read laliste
    set tout_le_fichier to the result
    close access laliste
    set nb to count paragraph of tout_le_fichier
    set ledossier to name of cheminsource
    repeat with i from 1 to nb
        
        tell application "Finder"
            set une_ligne to paragraph i of tout_le_fichier
            set AppleScript's text item delimiters to (ASCII character 59)
            set lenom to text item 1 of une_ligne & "_" & text item 2 of une_ligne & "_" & text item 3 of une_ligne
            set AppleScript's text item delimiters to ""
            
            duplicate cheminsource to chemincible
            set dest to chemincible & ledossier
            set dest to dest as string
            set name of folder dest to lenom
        end tell
        
    end repeat
end tell

my inspecter(chemincible)

on inspecter(un_dossier)
    set ledossier to un_dossier as string
    set ledossier to text 1 thru -2 of ledossier
    set AppleScript's text item delimiters to {":"}
    set ddd to get last text item of ledossier
    
    tell application "Finder"
        set les_fichiers to files of un_dossier
        
        repeat with chaque_fichier in les_fichiers
            
            set nom to name of chaque_fichier
            set extens to document file nom in un_dossier
            set lextension to name extension of extens
            
            set nouveaunom to (ddd & "." & lextension) as string
            
            
            set name of file nom of un_dossier to nouveaunom
        end repeat
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter


tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
```


----------



## baron (4 Février 2020)

zeltron54 a dit:


> Donc le nom du dossier sera:
> 9505_MARSEILLE ROCHES_13007
> etc.


Et ce dossier contiendra des copies de FICHIER-TYPE.xls et FICHIER-TYPE.doc,
nommées :
9505_MARSEILLE ROCHES_13007.xls
9505_MARSEILLE ROCHES_13007.doc



+++++++++++

P.S. Oups… tu as posté entretemps…
Ça a l'air vachement bien !

J'ajouterais juste encore ceci dans les explications préliminaires : 


zeltron54 a dit:


> il te demande de sélectionner le dossier type


… dans lequel tu auras placé un modèle des deux fichiers xls et doc.


----------



## zeltron54 (4 Février 2020)

Bonsoir @baron  
Tu as testé, ça fonctionne chez toi ?


----------



## aminjat (4 Février 2020)

je testerais ca jeudi quand j'aurais acces au fichier xls complet et je revient vers vous

en tout cas merci beaucoup d'avoir pris le temps de me repondre


----------



## baron (5 Février 2020)

zeltron54 a dit:


> Bonsoir @baron
> Tu as testé, ça fonctionne chez toi ?


Non, j'ai juste lu… 
(Et je n'aurai sans doute pas le temps ce soir.)


----------



## Riskybe (8 Août 2022)

zeltron54 a dit:


> voila un petit script qui devrait fonctionner:
> il faut enregistrer ta liste depuis excel au format : texte séparateur tabulation
> 
> le script te demandes de sélectionner le dossier source, puis le dossier cible, puis enfin le fichier liste,  puis il copie les fichiers de la liste de la source dans la cible.
> ...


----------

