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 :

Supprimer des sous dossiers sans supprimer les fichiers


Sujet :

AppleScript

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Supprimer des sous dossiers sans supprimer les fichiers
    Bonjour,

    Je ne dois pas être le seul à avoir besoin de cet AppleScript

    J'ai des dossiers remplis de sous dossiers avec des fichiers à la fin, faisant une arborescence à rallonge...

    Ex :

    Dossier parent > Sous dossier 1 > Sous dossier 2 > Sous dossier N > ... > 110 Fichiers

    Je souhaite donc supprimer les sous dossiers SANS supprimer les fichiers

    Dossier parent > 110 Fichiers

    Idéalement, en cliquant sur Exécuter, j'aimerais pouvoir donner à finder le dossier parent et en cliquent sur ouvrir, l'AppleScript efface les sous-dossiers

    Merci d'avance !

  2. #2
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    603
    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 : 603
    Points : 1 240
    Points
    1 240
    Par défaut Supprimer des sous dossiers sans supprimer les fichiers
    Bonjour Mathieu707,
    c'est une question récurrente de certains de mes amis aussi j'avais fait pour eux un petit script.
    Je viens de lui ajouter de nombreux commentaires pour qu'il soit plus utile sur ce forum (il y a autant de commentaires que de lignes de programme !!)

    J'espère ainsi qu'il pourra servir de base pour d'autres.
    Ouvre l'éditeur AppleScript et copie/colle le texte ci-dessous.

    Pour les premières utilisations, fait une copie de ton dossier avant, au cas où (toujours sauvegarder..on ne le dira jamais assez)...mais chez mes amis et moi, il fonctionne !

    A+
    PBell

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    -- Selection d'un dossier et remise à un seul niveau de tous les fichiers contenus dans les sous dossiers de sous dossiers...
    -- Une fois les fichiers au premier niveau, suppression des sous dossiers vides
     
    -- le programme est basé sur la cde unix ls -lR
    --   qui liste toute la sous arborescence des fichiers/dossiers en une seule commande
     
    -- Exemple, la cde : ls -lR /Users/Toto/Desktop/dossier_test
    --   renvoie : j'ai ajouté les commentaires entre () en fin de lignes
    --  total 272
    --  drwxr-xr-x  6 imac27  staff     204 29 sep 07:47 D 1 1  (c'est un dossier au niveau haut)
    --  drwxr-xr-x  2 imac27  staff      68 29 sep 07:44 D 1 2  (c'est un dossier au niveau haut)
    --  -rw-r--r--@ 1 imac27  staff  135612 28 sep 12:06 F1.pdf (c'est un fichier au niveau haut)
    --
    --  /Users/Toto/Desktop/test/D 1 1:                        (les lignes suivantes sont dans le dossier "D 1 1")
    --  total 272
    --  drwxr-xr-x  3 imac27  staff     102 29 sep 07:46 D2 1    (c'est un dossier dans le dossier D 1 1)
    --  drwxr-xr-x  4 imac27  staff     136 29 sep 07:46 D2 2
    --  -rw-r--r--@ 1 imac27  staff  135612 28 sep 12:06 F1 1.pdf (c'est un fichier dans le dossier D 1 1)
    --
    --  /Users/Toto/Desktop/test/D 1 1/D2 1:        ( les lignes suivantes sont dans le dossier D2 1 sous dossier de D 1 1
    --  total 272
    --  -rw-r--r--@ 1 imac27  staff  135612 28 sep 12:06 F 2 1.pdf
     
    -- On observe que : 
    --   Les lignes commençant par "/" nous donne le chemin des fichiers des lignes suivantes (enlever les : à la fin !)
    --   Les lignes commençant par "d" sont des dossiers (à oublier !)
    --   Les lignes commençant par "-" sont les fichier à bouger vers le dossier principal : les 50 premiers car. sont à supprimer
     
     
    -- Voilà le principe, il n'y a plus qu'à traduire cela en AppleScript !!...
     
    -- Selection du dossier parent :
    set Mon_Dossier to (choose folder with prompt "Selectionner le dossier à mettre à plat:") as string
    -- conversion de mon dossier du format Machine:Users:Toto:Desktop au format unix Machine/Users/Toto/Desktop
    -- attention, Unix ne comprend pas les " " qui doivent être changés en "\ "... c'est toute l'astuce
    -- on fait appel à une sub routine...qui est en fin de programme... c'est plus propre !!
    set Unix_Dossier to convertposix(POSIX path of Mon_Dossier)
    display dialog "path=" & Unix_Dossier
    -- commande unix et récupération du résultat dans lignes
    set Resultat to do shell script "ls -lR " & Unix_Dossier
    set Sous_Dossier to ""
    -- parcours des lignes qui sont chacune un paragraphe
    set Lignes to every paragraph of Resultat
     
    -- copie des fichiers vers le dossier principal
    repeat with Ligne in Lignes
        -- test sur chaque ligne : si elle est vide passe à la suivante
        if (length of Ligne) > 0 then
            set Premier_car to text 1 thru 1 of Ligne
            if Premier_car is "/" then
                -- c'est un chemin : copie dans le sous_dossier en supprimant le dernier caractere (:)
                set Sous_Dossier to text 1 thru ((length of Ligne) - 1) of Ligne
            end if
            if (Premier_car is "-") and not (Sous_Dossier = "") then
                -- c'est un fichier à copier seulement si sous_dossier n'est pas vide
                -- on supprime les 50 premiers caractères
                set Fichier to text 50 thru (length of Ligne) of Ligne
                -- conversion du chemin unix (/) en chemin "Finder" (:)
                set F_Fichier to POSIX file (Sous_Dossier & "/" & Fichier)
                --copie du fichier vers le dossier principal
                tell application "Finder" to move F_Fichier to Mon_Dossier
            end if
        end if
    end repeat
    -- fin du programme principal !
     
    -- suppression des dossiers vides restant : on prend la liste des dossiers dans le dossier principal
    tell application "System Events" to set Mes_Dossiers to every folder of folder Mon_Dossier
    -- pour chaque item de la liste, on le supprime
    repeat with i from 1 to the count of Mes_Dossiers
        tell application "Finder" to delete item i of Mes_Dossiers
    end repeat
     
    -- sub routine de conversion posix
    on convertposix(TChaine)
        -- converti les espaces " " en "\ " pour être utilisé en shell script soit ascii character 92 et espace
        -- on ne peut pas utiliser les applescript delimiter car les "/" sont aussi vus comme delimiters !!
        set NChaine to first character of TChaine
        repeat with i from 2 to count of characters of TChaine
            if character i of TChaine is " " then
                set NChaine to NChaine & (ASCII character 92)
            end if
            set NChaine to NChaine & (character i of TChaine)
        end repeat
        return NChaine
    end convertposix

  3. #3
    Candidat au Club
    Inscrit en
    Septembre 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci !

    Par contre j'ai un bug

    Ici le screenshot : http://cl.ly/0Y3n3M0d3Z2h3r210Z0a

    Cela plante à : "to move F_Fichier to Mon_Dossier" ...

    Un idée du bug?

  4. #4
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    603
    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 : 603
    Points : 1 240
    Points
    1 240
    Par défaut sous dossier
    Bonjour Mathieu707,
    je n'ai pas ce bug. il y a 2 choses à essayer :

    1) activer la fonction "activer les périphériques d'aide", dans Préférences système / accès universel / Clavier. j'avais des comportements bizarres en AppleScript avant de cocher cette case.

    2) juste avant le move, ajouter une ligne de trace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Display Dialog "Fichier=" & F_Fichier & return & "Dossier=" & Mon_Dossier
    Cette ligne doit afficher un dialogue avec :
    Fichier= nom de ton fichier
    Dossier= nom de ton dossier
    les noms doivent être corrects avec leur chemin d'accès séparés par des :
    par exemple : monmac:users:Toto:Desktop:Photo.jpg

    Si ce n'est pas le cas, il se peut que ce soit des problèmes de caractères dans les noms de dossier/fichiers.
    pour ton information, comme je passe souvent d'un système à l'autre (Unix / OSX / Windows) j'ai pris l'habitude de bannir les accents et certains signes.

    A+

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Argentine

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 5
    Points
    5
    Par défaut le même probleme des annees plus tard.
    je vois que ce probleme n'est pas nouveau mais pour moi du moins toujours pas resolu.
    en fait je voudrais recuperer tous mes fichiers qui sont dans la Bibliotheque photo sous le repertoire Masters et les copier dans un seul repertoire a coté.
    et puis faire de meme avec la musique de itunes et tout copier dans un seul repertoire sans aucun sous repertoire.

    J'ai eesayer la solution de PBELL mais jái moi aussi une erreur a la ligne MOVE "Le gestionnaire ne peut gerer des objets de cette classe" et je suis bloquer.

    Je suis sur un MacPro 2009 avec Osx el Captain, editeur de script 2.8.1
    Merci d'avance aux courageux qui prendront le temps de me repondre!

  6. #6
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    603
    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 : 603
    Points : 1 240
    Points
    1 240
    Par défaut
    Bonjour,
    Effectivement 7 ans plus tard...
    D'ailleurs, quand je relis mon script 7 ans après, je me rends compte que j'aurai pu faire bien mieux !
    Pour faire la même chose aujourd'hui, j'aurai la tentation de le faire en une ligne de commande Terminal, bien plus rapide et efficace. Cependant, comme c'est un forum Applescript, je vais le refaire en Applescript.

    Ci dessous 2 versions de script :
    - l'une qui fait exactement ce que tu souhaites : tous les fichiers des dossiers/sous dossiers remis à plat au niveau le plus haut
    - l'autre qui, en plus, ajoute aux noms des fichiers, un préfixe avec le nom du dossier initial.

    Prenons un exemple : un dossier Parent qui contient 2 dossiers, D1 et D2.
    D1 contient 2 fichiers F1, F2 et D2 contient un fichier F3.
    Avec le premier script, on obtient le dossier Parent contenant F1, F2 et F3
    Avec le second script, on obtient le dossier Parent contenant D1.F1, D1.F2, D2.F3 (le nom des fichiers est changé).

    L'avantage du second sur le premier est qu'il peut gérer les cas où D1 et D2 contiennent un fichier de même nom F. Dans le premier script le Finder génère une erreur, car il se retrouve avec 2 fichiers F dans le dossier Parent. Dans le second, le Finder se retrouve avec 2 fichiers de noms différents D1.F et D2.F,..donc pas d'erreur !

    A toi de voir, mais en particulier sur iTunes, tu auras surement le même morceau issu de 2 albums différents qui posera ce problème. Tout avoir à plat n'est peut être pas une si bonne idée.

    Premier script:
    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
    -- script de suppression des dossiers/ sous dossier avec copies des fichiers au niveau le plus haut
    
    on run
        tell application "Finder"
    activate-- 1
            set theDossRacine to ((choose folder with prompt "Choisissez le dossier racine :" without invisibles) as alias) as string -- 2
            set theDossParentList to (every folder of foldertheDossRacine) as alias list-- 3
            repeat with theDossParentAlias in theDossParentList-- 4
                set theDossParent to theDossParentAlias as string-- 5
    move every file of entire contents of folder theDossParent to folder theDossParent-- 6
    delete every folder of folder theDossParent-- 7
            end repeat
        end tell
    end run
    
    
    -- 1 : Appel et activation de l'application "Finder" pour effectuer toutes les opérations
    -- 2 : Choix du dossier racine contenant tous les dossiers parents
    -- 3 : Récupération de la liste des dossiers parents contenus dans le dossier racine
    -- 4 : Boucle traitant chaque dossier parent listé à l'étape précédente
    -- 5 : Récupération du dossier parent et transformation au format "string"
    -- 6 : Déplacement de tous les fihiers contentus dans l'ensemble de l'arborescence vers le premier niveau du dossier parent
    -- 7 : Suppression (déplacement vers la corbeille) de tous les dossiers présents au premier niveau de chaque dossier parent

    Second script :
    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
    -- bouge les fichiers des sous dossiers sur le dossier racine avec le nom sous-dossier.fichiertell application "Finder"
    -- Selection du dossier principal
        set DossRacine to ((choose folder with prompt "Choisissez le dossier racine :" without invisibles) as alias) as string -- 2
    -- Récupération des sous dossiers de ce dossier
        set Mes_Dossiers to (every folder of folder DossRacine) as alias list
        
        
    -- boucle sur chaque sous dossier
        repeat with Mon_Dossier in Mes_Dossiers
            set Nom_Dossier to name of Mon_Dossier as string
            
    -- boucle sur chaque fichier du sous dossier
            set Mes_Fichiers to every file of the folder Mon_Dossier
            repeat with Mon_Fichier in Mes_Fichiers
    -- change le nom du fichier en nom-sous-dossier.nom-fichier
                set the name of Mon_Fichier to Nom_Dossier & "." & name of Mon_Fichier
            end repeat
            
    -- mets tous les fichiers du sous dossier dans le dossier parent
    move every file of entire contents of folder Mon_Dossier to folder DossRacine
        end repeat
        
    -- suppression de tous les dossiers du dossier principal
    delete every folder of folder DossRacine
    end tell
    Dans les 2 cas, attention pas moyen de revenir en arrière ! Une sauvegarde avant l'opération est indispensable.

    Enfin, il faut savoir que le Finder n'est pas rapide en général. Donc si il s'agit de quelques dizaines ou centaines de fichiers cela ira. Si il s'agit de milliers de fichiers (bibliothèque photo), cela pourra prendre très longtemps.
    Tu peux contourner en lançant le script pour chaque dossier par année dans le dossier Master des photos.

    Cordialement

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Argentine

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Merci beaucoup PBELL, ta solution est exactement ce que je cherchais en plus d’être élégante et simple.
    pour ne pas commettre d'erreurs irréparables je l'ai un peut modifier en copiant tous le fichiers dans un répertoire différent et en n’effaçant pas les fichiers.

    Une fois de plus tu as raison, ma photothèque fait 115 Go et c'est beaucoup trop lent avec Applescript.
    En plus des arrets pour Time out j'ai les problèmes de nom de dossier qui ont des point au milieu du nom.
    Donc si tu as une version en ligne de commande qui soit plus efficace je l'accepte volontier.

    Bien cordialement

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Argentine

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    re bonjour,
    j'aimerais aussi pour rechercher tous les fichiers images et/ou videos de un répertoire et copier le résultat dans un autre
    je voudrais rechercher sur mes disque un peut partout les images , vidéos, et ensuite musique pour les regrouper dans un seul dossier pour son traitement futur.
    je pense qu'en Shell ce serais plus efficace aussi.

    Merci d'avance

  9. #9
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    603
    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 : 603
    Points : 1 240
    Points
    1 240
    Par défaut
    Bonjour,
    Voici en shell, la commande à utiliser (qui peut surement être améliorée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /Users/Moi/Desktop/Source -not -path '*/\.*' -type f -exec mv {} /Users/Moi/Desktop/Destination \;
    Explications :
    La commande 'find' cherche dans un dossier tous les fichiers répondant à certains critères quelque soit leur sous dossier:
    - Le dossier de recherche est ici /User/Moi/Desktop/Source (Moi est à remplacer bien sûr par ton utilisateur).
    Attention, si tu mets ton dossier 'Users/Moi/', la commande va chercher dans tous tes répertoires...mais risque de déplacer tes fichiers bibliothèque et tous les autres qui ne doivent pas être déplacés !!. Mieux vaut se limiter par exemple au dossier Images
    - les paramètres '-no -path '*/\.*' - type f permettent d'exclure les sous dossiers et les fichiers invisibles (type DS.DS_Store)
    - le paramètre -exec demande d'appliquer la commande qui suit aux fichiers trouvés par le find.

    Dans la commande '-exec', on effectue un mv (move) qui déplace les fichiers. Attention, il ne les copie pas, mais les déplace sans les laisser à l'emplacement d'origine.
    Le paramètre {} indique que l'objet à déplacer est le résultat de la commande find. Ainsi le mv sera appliqué à chaque fichier trouvé.
    Enfin, le 'User/Moi/Desktop/Destination est le dossier dans lequel les fichiers seront déplacés. Il va de soit que ce dossier ne doit pas faire partie du dossier de recherche !

    Quant à la vitesse, cela n'a rien à voir avec le Finder. Ce serait comparer une Ferrari avec une bonne vieille 2CV Citroën !

    J'insiste sur les précautions à prendre :
    - Etant au niveau shell, pas de protection, de demande de confirmation, ni de marche arrière possible (pas de menu Annuler !)
    - Si le dossier source est trop général, par exemple ton User, les fichiers de la bibliothèque seront déplacés, donc un plantage certain.
    - Si tu souhaites malgré tout chercher à partir de ton dossier User, il faut mettre au moins des limites sur les extensions (par exemple -no -path '*/\.jpg' - type f ne traite que les fichiers d'extension .jpg. A étudier si tu as aussi des .raw, .JPG, .Tiff,... ou toutes sortes d'extension de fichier audio.

    Comme seuls les fichiers sont déplacés, il suffit simplement de supprimer les anciens dossiers/sous dossier...si ils sont vides !

    Cordialement

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Mars 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Argentine

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2018
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    un grand merci pour le temps que tu m'as consacré.
    un grand remerciment, bien cordialement.

Discussions similaires

  1. [XL-2007] lister les dossiers et sous dossiers et compter les fichiers
    Par barto92 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/01/2013, 20h53
  2. Réponses: 2
    Dernier message: 31/07/2012, 11h50
  3. Supprimer des sous-dossier d'un dossier (loop)
    Par Rodman_ dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 27/03/2012, 20h06
  4. [URL Rewriting] Supprimer des sous dossiers
    Par thanathz dans le forum Apache
    Réponses: 1
    Dernier message: 20/05/2008, 12h53
  5. Supprimer des sous-dossiers selon des critères
    Par Dertron dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 18/01/2006, 14h33

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