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 :

Folders & Files structure


Sujet :

AppleScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Par défaut Folders & Files structure
    Bonjour,

    Je cherche à créer un script qui me permet de créer un fichier TXT avec les avec une chaine d'information que je peux ensuite remettre en page dans un tableur LibreOffice par exemple.

    L'idée est de récupérer le "name" des dossiers et leur poids, et également de trouver le nombre de fichier .mov par exemple contenu dans le dossier ou dans des sous dossiers.

    Exemple structure :
    MonMac/ dossier1 / sousdossier 01/ 9 fichiers mov dedans
    MonMac/ dossier2 / 10fichiers mov dedans
    MonMac/ dossier3 / sousdossier 01/ sousdossier 02/ 3 fichiers mov dedans.

    Exemple de fichier txt attendu
    NAME - SIZE - Nb Fichier MOV

    J'ai trouvé des parties de script pour trouver les fichiers avec un type d'extention, la taille mais je n'arrive pas à combiner le tout.

    Merci de vos retours.

  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
    Bonsoir,
    Il y a plusieurs méthodes possibles et j'ai choisi la plus rapide.
    En effet, les scripts courants pourraient faire appel aux recherches des fichiers '.mov' via le Finder, mais avec beaucoup de dossier et de sous dossiers, le Finder se révèle très lent.
    Ne connaissant pas ta structure de fichiers et la complexité de tes dossiers, j'utilise l'instruction shell 'find' (qui peut aussi s'utiliser via le Terminal).
    Par exemple : find /mondisque/Users/monUser -name '*.mov'
    Cela donne la liste de tous les fichiers d'extension '.mov' sur tous les dossiers et sous dossiers inclus dans le dossier 'monUser', et cela en une seconde !
    Le résultat est une suite de lignes (Applescript appelle cela des 'paragraphs').
    L'avantage est que les lignes sont triées par dossier !

    Il faut ensuite effectuer une boucle sur chaque ligne de résultat (exemple /mondisque/Users/monUser/mondossier/monsousdossier/Disney.mov), transformer ce texte en fichier pour en extraire son nom (name) et son dossier (container).

    Si le nom du dossier est le même que celui de la ligne précédente, on fait un cumul (nb fichier +1 et ajout de la taille)
    Si le nom du dossier est différent, il faut enregistrer les résultats (sauf si c'est le premier fichier), remettre les compteurs à 0 (à la valeur de la ligne en fait)
    Bien sûr, i faut aussi enregistrer les résultats si on est à la dernière ligne !

    L'enregistrement d'un ligne se fait via un sous programme 'Ecrit' qui nécessite 2 paramètres : le nom du fichier et la ligne a écrire.

    J'ajoute que le calcul de la taille se fait en Mo (taille en octets / 1000 000 sans décimale) : 2 567 123 octets donnera 2Mo. Tu es libre de changer ce calcul bien sûr.

    Dans le script ci-dessous, le dossier de départ est ton dossier home (ta 'maison') et le fichier 'Log.txt' est enregistré sur le bureau.
    J'ai mis plein de commentaires pour que chacun puisse adapter si nécessaire.

    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
    set FLog to ((path todesktop folder) as string) & "Log.txt" -- le fichier Log.txt sera sur le bureau
    
    set DossierDepart to path tohome folder
    set DossierTexte to text 1 thru -2 of ((POSIX path of DossierDepart) as string) -- mise en forme Shell sans le dernier '/'
    
    
    
    
    -- recherche via l'instruction Shell 'Find' qui est récursive (sous dossiers) et tres rapide !
    set ListeTexte to do shell script "find " & (quoted form of DossierTexte) & " -name  '*.mov'"
    set Liste to every paragraph of ListeTexte
    set CumulNom to ""
    set CumulNb to 0
    set CumulTaille to 0
    
    
    repeat with I from 1 to count of Liste
        set Fichier to (POSIX file (item I of Liste)) as alias
        tell application "System Events"
            set DosNom to name of container of Fichier
            set Taille to ((size of Fichier) / 1000000) as integer -- converti les octets en Mega !
            if DosNom = CumulNom then -- c'est toujours le même dossier: cumul de la taille et incrément du nombre de fichiers
                set CumulNb to CumulNb + 1
                set CumulTaille to CumulTaille + Taille
            else -- c'est un nouveau dossier: Ecriture de la ligne et remise des compteurs à 0 (sauf pour le premier !)
                if I > 1 then my Ecrit(FLog, "Dossier:" & CumulNom & "   " & CumulTaille & "Mo    Nombre de fichiers=" & CumulNb)
                set CumulNom to DosNom
                set CumulTaille to Taille
                set CumulNb to 1
            end if
            if I = (count of paragraph of Liste) then -- c'est la dernière ligne , il faut écrire le résultat
                my Ecrit(FLog, "Dossier:" & CumulNom & "   " & CumulTaille & "Mo    Nombre de fichiers=" & CumulNb)
            end if
        end tell
    end repeat
    
    
    on Ecrit(FTexte, T) -- ecrit la ligne dans le fichier FTexte)
        try
    open for accessfileFTexte with write permission-- ouvre le fichier et le crée si besoin
    write (T & return) tofileFTextestarting ateof-- écrit la ligne en fin de fichier    
    close accessfileFTexte
        on error
            try
    close accessfileFTexte
            end try
        end try
    end Ecrit
    Cordialement

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Développeur multimédia
    Inscrit en
    Octobre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Octobre 2016
    Messages : 2
    Par défaut
    Ah oui, je ne pensais pas recevoir un script tout fait mais alors la, chapeau !!!!!
    Un grand merci, je vais analyser cela pour tout bien comprendre.

Discussions similaires

  1. [Débutant] aide: lire un fichier binary file (structure connue)
    Par forzacodm dans le forum VB.NET
    Réponses: 0
    Dernier message: 01/04/2013, 20h26
  2. import / copy folder from file system
    Par chichone dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 13/06/2008, 16h10
  3. Quelle structure Perl pour lire file texte formaté
    Par calima dans le forum Langage
    Réponses: 2
    Dernier message: 26/07/2006, 14h51
  4. champs de la structure FILE
    Par jexistetjs dans le forum C
    Réponses: 2
    Dernier message: 15/10/2003, 22h02

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