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

Guillaume16

Membre enregistré
23 Juin 2014
6
1
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.
 
Bonjour,

Avec automator je ne connais pas, mais réalisable avec un petit script applescript.
 
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 .
 
Dernière édition:
  • J’aime
Réactions: pouppinou
Content pour toi !

Pense à mettre résolu !
 
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.
 
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 !
 
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.
 
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.
 
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...
 
Ok je regarde pour adapter ça.
 
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.
 
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 !
 
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.

Bloc de code:
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
 
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.
 
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.
 
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é.

Bloc de code:
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