# Lister des fichiers images avec les dimensions



## phenice (10 Juin 2022)

Bonjour tout le monde,

Je cherche désespéramment à me faire une appli ou un processus Automator permettant de :
1. identifier un répertoire dans le finder
2. lister de manière récursive tous les fichiers images ou PDF dans ce répertoire et sous-répertoires
3. Obtenir Les infos: Nom de dossier, nom de fichier, type d'image, résolution (dpi), dimensions X et Y
4. écrire les résultats dans un fichier avec un séparateur de type ";"

J'ai tenté d'utiliser plein de bouts de scripts ici et là, mais je me retrouve avec des erreurs en pagaille et j'avoue ne pas du tout maîtriser le coding sur Mac.
Quelqu'un aurait-il 5 minutes pour examiner mon problème ?

D'avance merci de votre aide.

PhEn


----------



## zeltron54 (10 Juin 2022)

Bonjour,

Pour écrire un applescript qui ferait çà, il faudrait plus d'explications.


phenice a dit:


> 3. Obtenir Les infos: Nom de dossier, nom de fichier, type d'image, résolution (dpi), dimensions X et Y


quel nom de dossier ? le source ou le dossier juste avant le fichier, et présenté avec l'ensemble du chemin ou juste le nom ?

Type d'image  (il est contenu dans la nom du fichier (l'extension))

La résolution ??
En ayant  les dimensions (en pixel) de ton image tu as tous les éléments, la résolution dépendra de ton choix de dimension pour l'affichage et pour l'impression...

Si l'utilisation des données est pour un tableur il vaudrait mieux utiliser une tabulation plutôt qu'un point virgule comme séparateur.

Avec ses réponses je pourrai te faire un petit script...


----------



## zeltron54 (11 Juin 2022)

Bonjour,
je t'ai fait un petit applescript qui à son lancement te demande de sélectionner le dossier à traiter.
Il traite tous le fichiers du dossier et de ses sous-dossiers. Quand il a terminé il te met un message.

Il traite le fichiers dont l'extension est : "jpg", "jpeg", "png", "tiff", "gif", "bmp", "psd" et les PDF.

Il crée sur le bureau un fichier texte "laliste.txt" qui contient un fichier par ligne le séparateur est la tabulation.
Il y a : le chemin complet du fichier, le nom du fichier, la taille, la hauteur en pixels et la largeur en pixels.

Ce fichier peut s'ouvrir avec "numbers" ce qui te donne une ligne par fichier et un élément par colonne dans l'ordre cité ci-dessus.
Si une valeur (hauteur ou largeur n'existe pas elle est renseignée "(null)".

Si il y a une erreur sur le traitement d'un fichier il met un message d'erreur (a valider) !

Dis moi si cela te va, et s'il faut faire des modifications.


```
property lataille : "" --déclaration de variables globales
property lalargeur : ""
property lahauteur : ""
property lefichier : ""
property nom : ""
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à lister"
    my inspecter(chemin) -- appel routine inspecter
end tell

on inspecter(un_dossier)
    tell application "Finder"
        
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set Fimage to {"jpg", "jpeg", "png", "tiff", "gif", "bmp", "psd"} -- liste des extensions a traiter dans Fimage avec fonction mdls
        
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier --récupère tous les fichiers du dossier
        repeat with chaque_fichier in les_fichiers -- répète avec chaque fichier du dossier en cour
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set lefichier to chaque_fichier as string --récupère le chemin du fichier au format chaine de caractères
                
                try --bloc si erreur
                    
                    if lextension is in Fimage then -- si fichier video de la liste Fimage
                        
                        set lataille to do shell script "mdls -name kMDItemFSSize " & quoted form of POSIX path of lefichier --récupère la taille au fromat mdls
                        set lahauteur to do shell script "mdls -name kMDItemPixelHeight " & quoted form of POSIX path of lefichier --récupère la hauteur pixel format mdls
                        set lalargeur to do shell script "mdls -name kMDItemPixelWidth " & quoted form of POSIX path of lefichier --récupère la largeur pixel format mdls
                        set AppleScript's text item delimiters to {" "} -- defini le separateur
                        set lataille to last text item of lataille
                        set lahauteur to last text item of lahauteur
                        set lalargeur to last text item of lalargeur
                        
                        my ecriture() --appel pour ecriture dans fichier texte du fichier
                    end if
                    
                    if lextension is "pdf" then -- si fichier video de la liste FVideo_dv_avi
                        
                        set lataille to do shell script "mdls -name kMDItemFSSize " & quoted form of POSIX path of lefichier
                        set lahauteur to do shell script "mdls -name kMDItemPageHeight " & quoted form of POSIX path of lefichier
                        set lalargeur to do shell script "mdls -name kMDItemPageWidth " & quoted form of POSIX path of lefichier
                        set AppleScript's text item delimiters to {" "} -- defini le separateur
                        set lataille to last text item of lataille
                        set lahauteur to last text item of lahauteur
                        set lalargeur to last text item of lalargeur
                        
                        my ecriture() --appel pour ecriture dans fichier texte du fichier
                    end if
                on error the errorMessage number the errorNumber --recup message si erreur
                    display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier --affiche message si erreur
                end try
            end tell
        end repeat -- fichier suivant
        
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers -- dossier suivant
            my inspecter(chaque_dossier) -- appel pour dossier suivant
        end repeat
    end tell
end inspecter -- fin routine inspecter


on ecriture()
    set lelog to open for access ((path to desktop folder as text) & "laliste.txt") as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
    write lefichier & (ASCII character 9) & nom & (ASCII character 9) & lataille & (ASCII character 9) & lahauteur & (ASCII character 9) & lalargeur & return to lelog starting at eof
    close access lelog -- ferme le fichier log
end ecriture


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


----------



## phenice (11 Juin 2022)

Salut Zeltron54,

Wooowww ... ça fait carrément le taff ! ...
Juste 2 ou 3 petites modifs que je n'arrive pas à faire :
A. Ajouter le poids en octets (oups oubli de ma part)
B. Créer des fichiers de 50.000 lignes max avec une numérotation séquentielle des fichiers de sortie si >50000 lignes
C. Nommer les fichiers résultats : Nom_du_Dossier_selectionné-Timestamp(format JJ-HH-MM)-#ordreSéquentiel

J'ai trouvé comment changer le séparateur en ; au lieu de TAB ... Ascii(59) ;-)

Merci de ton aide, c'est top !!!


----------



## zeltron54 (11 Juin 2022)

Bonjour,

Je n'ai pas précisé. pour utiliser le script:

Ouvrir l’application “Editeur de script” qui est dans Application—>Utilitaires
Choisir le bouton en bas à gauche “Nouveau document”, dans la fenêtre qui s’ouvre faire un copier-coller du script.
Cliquer sur le bouton en haut à gauche “Exécuter”


----------



## phenice (11 Juin 2022)

zeltron54 a dit:


> Bonjour,
> 
> Je n'ai pas précisé. pour utiliser le script:
> 
> ...


Ben je me suis créé une app automator avec une action "exécuter un script", ça marche


----------



## zeltron54 (12 Juin 2022)

Bonjour,


phenice a dit:


> A. Ajouter le poids en octets (oups oubli de ma part)


Pour le poids en octets, c'est ce que j'ai appelé la taille (le troisième item).



phenice a dit:


> C. Nommer les fichiers résultats : Nom_du_Dossier_selectionné-Timestamp(format JJ-HH-MM)-#ordreSéquentiel


Tu veux parler du fichier que j'ai appelé "laliste.txt" a renommer avec le nom du dossier sélectionné au départ suivi de jour-heures-minutes (de la création de ce fichier) suivi d'un numéro d'ordre (sur 2 caractères: 01-02 etc...) ?
Ce fichier ne doit contenir que 50000 lignes max ...

Ai-je bien compris ?
Si oui je regarde pour ajouter cela.

Edit: pour le changement de tabulation en point virgule, j'espère pour toi qu'il n'y a pas de nom de fichier avec un ";".


----------



## zeltron54 (12 Juin 2022)

Un nouveau script qui fait ce que tu as demandé.
il limite les fichiers à 50000 lignes
il nomme les fichiers avec : nom du dossier sélectionné au départ_JJ-HH-MM_numéro ordre
le séparateur d'éléments est le ";"

Pour modifier le nombre de lignes maxi dans le fichier il suffit de modifier le valeur dans la ligne:

else if nbligne = 50000 then

Remplacer 50000 par la valeur voulue, cela te permettra de tester sur un petit nombre...

Dans le nom du dossier  JJ-HH-MM  est le jour, l'heure et les minutes , si c'est autre chose que tu voulais mettre, fais moi signe je modifierai.

J'attends le résultat de tes tests .   


```
property lataille : "" --déclaration de variables globales
property lalargeur : ""
property lahauteur : ""
property lefichier : ""
property nom : ""
property nbligne : 0
property nomdosfich : ""
property nomfichier : ""
property nbfichier : 0
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à lister"
    set nomdosfich to name of chemin as string
    my inspecter(chemin) -- appel routine inspecter
end tell

on inspecter(un_dossier)
    tell application "Finder"
        
        set nomdos to name of un_dossier -- recupere le nom du dossier
        set Fimage to {"jpg", "jpeg", "png", "tiff", "gif", "bmp", "psd"} -- liste des extensions a traiter dans Fimage avec fonction mdls
        
        -- traitement des fichiers :
        set les_fichiers to files of un_dossier --récupère tous les fichiers du dossier
        repeat with chaque_fichier in les_fichiers -- répète avec chaque fichier du dossier en cour
            -- traitement d'un fichier
            tell application "Finder"
                set nom to name of chaque_fichier --récupère le nom du fichier
                set AppleScript's text item delimiters to {"."} -- defini le separateur
                set lextension to get last text item of nom -- recupère l'extension
                set lefichier to chaque_fichier as string --récupère le chemin du fichier au format chaine de caractères
                
                if nbligne = 0 then
                    set nbfichier to nbfichier + 1
                    set ordre to text -2 thru -1 of ("0" & nbfichier)
                    set ladate to current date
                    set lejour to day of ladate as string
                    set lejour to text -2 thru -1 of ("0" & lejour)
                    set lheure to (time of ladate) div 3600 as string
                    set lheure to text -2 thru -1 of ("0" & lheure)
                    set laminute to ((time of ladate) mod 3600) div 60 as string
                    set laminute to text -2 thru -1 of ("0" & laminute)
                    set nomfichier to nomdosfich & "_" & lejour & "-" & lheure & "-" & laminute & "_" & ordre
                else if nbligne = 50000 then
                    set nbfichier to nbfichier + 1
                    set ordre to text -2 thru -1 of ("0" & nbfichier)
                    set ladate to current date
                    set lejour to day of ladate as string
                    set lejour to text -2 thru -1 of ("0" & lejour)
                    set lheure to (time of ladate) div 3600 as string
                    set lheure to text -2 thru -1 of ("0" & lheure)
                    set laminute to ((time of ladate) mod 3600) div 60 as string
                    set laminute to text -2 thru -1 of ("0" & laminute)
                    set nomfichier to nomdosfich & "_" & lejour & "-" & lheure & "-" & laminute & "_" & ordre
                    set nbligne to 0
                end if
                
                try --bloc si erreur
                    
                    if lextension is in Fimage then -- si fichier video de la liste Fimage
                        
                        set lataille to do shell script "mdls -name kMDItemFSSize " & quoted form of POSIX path of lefichier --récupère la taille au fromat mdls
                        set lahauteur to do shell script "mdls -name kMDItemPixelHeight " & quoted form of POSIX path of lefichier --récupère la hauteur pixel format mdls
                        set lalargeur to do shell script "mdls -name kMDItemPixelWidth " & quoted form of POSIX path of lefichier --récupère la largeur pixel format mdls
                        set AppleScript's text item delimiters to {" "} -- defini le separateur
                        set lataille to last text item of lataille
                        set lahauteur to last text item of lahauteur
                        set lalargeur to last text item of lalargeur
                        
                        my ecriture() --appel pour ecriture dans fichier texte du fichier
                        set nbligne to nbligne + 1
                    end if
                    
                    if lextension is "pdf" then -- si fichier video de la liste FVideo_dv_avi
                        
                        set lataille to do shell script "mdls -name kMDItemFSSize " & quoted form of POSIX path of lefichier
                        set lahauteur to do shell script "mdls -name kMDItemPageHeight " & quoted form of POSIX path of lefichier
                        set lalargeur to do shell script "mdls -name kMDItemPageWidth " & quoted form of POSIX path of lefichier
                        set AppleScript's text item delimiters to {" "} -- defini le separateur
                        set lataille to last text item of lataille
                        set lahauteur to last text item of lahauteur
                        set lalargeur to last text item of lalargeur
                        
                        my ecriture() --appel pour ecriture dans fichier texte du fichier
                        set nbligne to nbligne + 1
                    end if
                on error the errorMessage number the errorNumber --recup message si erreur
                    display dialog "erreur: " & errorMessage & " sur le  fichier " & lefichier --affiche message si erreur
                end try
            end tell
        end repeat -- fichier suivant
        
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers -- dossier suivant
            my inspecter(chaque_dossier) -- appel pour dossier suivant
        end repeat
    end tell
end inspecter -- fin routine inspecter


on ecriture()
    set lelog to open for access ((path to desktop folder as text) & nomfichier) as text with write permission -- ouvre le fichier log et ecritles valeur séparé par une tabulation
    write lefichier & ";" & nom & ";" & lataille & ";" & lahauteur & ";" & lalargeur & return to lelog starting at eof
    close access lelog -- ferme le fichier log
end ecriture


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


----------



## phenice (12 Juin 2022)

Oh purée !!! Zeltron, tu déchires ... désolé j'avais pas vu ton message de 19:30
Je viens de tester en limitant à 50 lignes/fichier et ça m'a bien généré le bon nombre de fichiers avec la bonne découpe ... génial !
Merci bcp !


----------



## zeltron54 (13 Juin 2022)

Si tout te convient, alors content pour toi !


----------

