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 :

Fusionner des sous dossiers [AppleScript]


Sujet :

AppleScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur environnement
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur environnement

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut Fusionner des sous dossiers
    Bonjour a tous les passionnés d'Applescript,

    Comme l'indique le titre, je cherche à fusionner des sous-dossiers qui ont le même titre. Voila en gros l'architecture de ce dont je dispose sachant :
    - Que le niveau 3 est contenu dans le niveau 2, lui-même contenu dans le niveau 1
    - Qu'il y a en réalité plus de trois dossiers de niveau 1
    - Que les dossier qui ont le même nom dans l'exemple suivant ont le même nom dans la réalité et que si le nom est différent dans l'exemple il le sera aussi en réalité :

    Niveau 1 Dossier A Dossier B Dossier C ... Dossier Z (destination)
    Niveau 2 Dossier rouge Dossier rouge Dossier rouge ... Dossier rouge (destination)
    Niveau 3 Dossier 1
    Dossier 2
    Dossier 3
    Dossier 4
    Dossier 5
    Dossier 6
    Dossier 7
    Dossier 8
    Dossier 1
    Dossier 2
    Dossier 3
    Dossier 4
    Dossier 5
    Dossier 6
    Dossier 7
    Dossier 8
    Dossier 1
    Dossier 2
    Dossier 3
    Dossier 4
    Dossier 5
    Dossier 6
    Dossier 7
    Dossier 8
    ... Dossier 1 (destination)
    Dossier 2 (destination)
    Dossier 3 (destination)
    Dossier 4 (destination)
    Dossier 5 (destination)
    Dossier 6 (destination)
    Dossier 7 (destination)
    Dossier 8 (destination)

    Je souhaiterais sélectionner les dossier du niveau le plus haut possible (donc 1 de préférence) et que des copies des fichier contenus dans les dossiers de niveau 3 se synchronisent respectivement dans le dossier de destination correspondant (Ex : tous les fichiers des "dossier 1" dans le "dossier 1 (destination)" etc). Sachant que les dossier de destination contiennent déja des fichiers qui ne doivent pas être remplacés si un fichier porte le même nom.

    J'ai effectué quelques recherches sur le sujet et j'ai trouvé les fonctions cp et ditto mais je n'arrive pas à déterminer si elles peuvent répondre précisément à mon besoin.

    Sinon j'ai trouvé le bout de code suivant mais il ne fait que réunir les dossier mais pas le contenu des dossiers de niveaux inférieurs:
    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
    on run
    choose folder with prompt "Get contents of these folders:" default location (path to home folder) ¬
    with showing package contents and multiple selections allowed
    open (result)
    end run
     
    on open droppedItems
    choose folder with prompt "Merge into this folder:" default location (path to home folder) ¬
    with showing package contents
    set target to quoted form of POSIX path of result
     
    display dialog "How to handle existing files?" buttons {"Overwrite", "Cancel", "Skip"} default button 3
    if (button returned of result) is "Overwrite" then
    set overwriteOption to "f"
    else
    set overwriteOption to "n"
    end if
     
    repeat with thisItem in droppedItems
    if (folder of (info for thisItem without size)) is true then
    get quoted form of POSIX path of thisItem
     
    try
    do shell script "cd " & result & "; /bin/cp -RP" & overwriteOption & " ./* " & target
    on error errorMsg number errorNum
    display dialog "Error (" & errorNum & "):" & return & return & errorMsg buttons "OK" default button 1 with icon caution
    end try
    end if
    end repeat
     
    display dialog "Script finished." buttons "OK" default button 1 with icon note
    end open
    Si vous pouviez m’éclairer sur le sujet ou me proposer un script, un commande plus appropriée, je vous en serait très reconnaissant.

    Merci d'avance

  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 SuperLuminou,
    Je dois être un peu fatigué ce soir, mais j'avoue ne pas saisir la subtilité de ton but.

    Si tu choisis le niveau 1 (dans lequel il y a 3 dossiers), tu veux copier les fichiers du niveau 3 dans un dossier de même nom situé au niveau 3 d'un dossier de destination.

    Donc copier dossier A / dossier rouge / dossier 1 / chaque fichier -> dossier destination / dossier Rouge / dossier 1 / même nom de fichier
    OK, ça c'est assez facile avec un move. Si le fichier existe déjà dans destination/Rouge/dossier1 on ne fait rien

    Mais qu'en est-il quand on traite le dossier B. idem ?
    Dans ce cas, cela signifie que tu garde en destination en priorité le fichier présent, sinon, celui venant de A, sinon celui de B et ainsi de suite.
    Est-ce à dire que tu veux que les dossier A, B, C soient traités dans l'ordre alphabétique ?

    De plus, si le dossier de niveau 2 n'existe pas dans destination avant la copie, veux tu qu'il soit crée ?
    Enfin, peut-il exister des fichiers dans les dossiers de niveau 1 et 2 ? ou est-ce seulement des dossiers comme dans ton exemple ?

    Avec des réponses à ces questions, cela ne devrait pas présenter de problème de faire un petit script

    Cordialement
    Cordialement

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur environnement
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur environnement

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Merci PBELL pour ta réponse, voila les miennes :

    Citation Envoyé par PBELL Voir le message
    Si tu choisis le niveau 1 (dans lequel il y a 3 dossiers), tu veux copier les fichiers du niveau 3 dans un dossier de même nom situé au niveau 3 d'un dossier de destination.
    Exactement, sauf qu'il y a en réalité plus que 3 dossiers sources de niveau 1.

    Citation Envoyé par PBELL Voir le message
    Donc copier dossier A / dossier rouge / dossier 1 / chaque fichier -> dossier destination / dossier Rouge / dossier 1 / même nom de fichier (...) Si le fichier existe déjà dans destination/Rouge/dossier1 on ne fait rien
    Oui, je souhaite copier le contenu de chaque dossier 1 dans le dossier 1 de destination, puis le contenu de chaque dossier 2 dans le dossier 2 de destination etc...
    Oui toujours donner la priorité aux fichiers contenus dans les dossiers de destination (numérotés de 1 à 8).

    Citation Envoyé par PBELL Voir le message
    Mais qu'en est-il quand on traite le dossier B. idem ?
    Dans ce cas, cela signifie que tu garde en destination en priorité le fichier présent, sinon, celui venant de A, sinon celui de B et ainsi de suite.
    Est-ce à dire que tu veux que les dossier A, B, C soient traités dans l'ordre alphabétique ?
    A priori, vu que l'on donne toujours la priorité au fichiers des dossiers de destination, l'ordre n'a pas d'importance.

    Pour expliquer plus précisément : Les dossiers de destination (niveau 3) contiennent uniquement des fichiers génériques (dans leur dernière version). Les autres dossiers de niveaux 3 contiennent ces mêmes fichiers génériques (dans une ancienne version) ainsi que des fichiers qui leurs sont spécifiques. En fait je souhaite rassembler tous les fichiers spécifiques avec les fichiers génériques (dernière version) qui se trouvent dans les dossiers de destination.

    Citation Envoyé par PBELL Voir le message
    De plus, si le dossier de niveau 2 n'existe pas dans destination avant la copie, veux tu qu'il soit crée ?
    Enfin, peut-il exister des fichiers dans les dossiers de niveau 1 et 2 ? ou est-ce seulement des dossiers comme dans ton exemple ?
    Le dossier de destination existe tel qu'il est présenté dans l'exemple (avec la même architecture que les dossiers sources)
    Il existe d'autres dossiers dans le niveau 2 (le dossier de niveau 1 n'est la que pour les regrouper) et aussi des fichiers dans le niveau 3, mais s'il posent problème on peut les supprimer du dossier source car ils sont déja présents dans le dossier destination. Et s'ils posent problèmes dans le dossier de destination, je peux les supprimer et les remettre une fois la fusion terminée.

    Merci encore

    Cordialement

  4. #4
    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
    Bonjour SuperLuminou,

    Voici le code du script que j'ai testé et qui réponds à ton besoin.
    j'ai tout de même prévu les cas où les dossiers/sous-dossiers n'existent pas déjà dans la destination : le script les crée, ce qui te garantie une similitude des noms et arborescences.
    Tu peux ainsi même lancer le script avec un dossier destination vide la première fois !

    Le script te demande d'abord le dossier de niveau 0 (qui peut contenir autant de dossier A, B, C, ... que possible).
    Puis tu sélectionne le dossier destination.

    Cordialement

    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
    -- sélection du dossier niveau 0 sourceset Source to choose folder with prompt " Sélection niveau 0 source"
    -- sélection du dossier niveau 1 destination 
    set Destination to (choose folder with prompt " Sélection niveau 0 source") as string
    
    
    -- pour chaque dossier niveau 1 source (dossier A, dossier B, dossier C)
    tell application "Finder"
        set Niv_1 to every folder of Source
        repeat with Dos_1 in Niv_1-- pour chaque dossier de niveau 1
            
            set Niv_2 to every folder of Dos_1
            repeat with Dos_2 in Niv_2-- pour chaque dossier de niveau 2 contenu dans le niveau 1 (dossier rouge, vert, bleu,...)
    -- on vérifie que le dossier niveau 2 existe dans Destination, sinon, on le crée
                set Nom_2 to name of Dos_2
                if not (exists (Destination & Nom_2)) then
    -- on crée le dossier
    make new folder at Destination with properties {name:Nom_2}
                end if
                set Niv_3 to every folder of Dos_2
                
                repeat with Dos_3 in Niv_3-- pour chaque dossier de niveau 3 contenu dans le niveau 2 dans niveau 1 (dossier 1, dossier 2,...)
    -- on vérifie que le dossier niveau 3 existe dans Destination/Niveau 2, sinon, on le crée
                    set Nom_3 to name of Dos_3
                    set Dest_Niv_3 to (Destination & Nom_2 & ":" & Nom_3)
                    if not (exists (Dest_Niv_3)) then
    -- on crée le dossier
    make new folder at (Destination & Nom_2) with properties {name:Nom_3}
                    end if
    -- on effectue la copie de chaque fichier (impossible de faire un duplicate every file à cause des erreurs°
                    set Liste_Fichier to every file of Dos_3
                    
                    repeat with F in Liste_Fichier-- boucle sur chaque fichier du dossier
                        try
    duplicate F to Dest_Niv_3 without replacing
                        end try
                    end repeat -- sur chaque fichier
                    
                end repeat -- Niv_3
                
            end repeat -- Niv_2
            
        end repeat -- Niv_1
    end tell

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur environnement
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur environnement

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Par défaut
    Merci, je vais regarder ça dès que possible, et je viendrais mettre [résolu] si tout fonctionne.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcourir noms des sous-dossiers
    Par Archalia dans le forum Langage
    Réponses: 1
    Dernier message: 13/11/2007, 18h58
  2. [batch] suppression des sous-dossiers
    Par mathieu_r dans le forum Windows
    Réponses: 1
    Dernier message: 12/03/2007, 21h53
  3. Réponses: 4
    Dernier message: 29/08/2006, 19h02
  4. Supprimer des sous-dossiers selon des critères
    Par Dertron dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 18/01/2006, 15h33
  5. Creation d'un dossier et des sous dossier
    Par fraizas dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 14/11/2005, 17h30

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