Automator : désarchiver automatiquement les archives se trouvant dans plusieurs dossiers différent

Kersey

Membre junior
30 Octobre 2008
10
0
La situation est la suivante :

J’ai un disque dur avec dessus 4 dossiers représentant chacun une catégorie de classement.

Chacun de ces dossiers contiennent eux-mêmes plusieurs sous-dossiers.

Presque tous ces sous-dossiers contiennent des archives de type .zip, .rar, .dms

J’ai évidemment la possibilité d’aller dans chaque dossier et d’extraire moi-même chaque archive manuellement, mais cela me prendra beaucoup trop de temps !

Si toutes les archives étaient dans le même dossier alors je les glisserais toute sur l’icône de « The Unarchiver » qui est capable de gérer automatiquement le désarchivage ou l’archivage de toute une série d’archives et d’effacer les fichiers initiaux une fois cela fait. Seulement voilà ce n’est pas le cas, toutes ces archives se trouvent dans des dossiers différents ! Je pourrais éventuellement afficher en « mode liste » la liste de tous ces sous-dossiers puis cliquer sur le petit triangle au-dessus à gauche pour à chaque fois afficher leur contenu puis manuellement sélectionner toute les archives à décompresser une à une puis glisser cette selection sur l’icône de « The Unarchiver » qui assurera la suite mais, là aussi, vu le nombre de sous-dossiers, cela me prendra beaucoup trop de temps !

J’ai essayé avec Automator d’obtenir un workflow (càd une suite d’actions se déroulant automatiquement) qui fasse ce que je désire de manière automatique, mais … sans succès ! Je ne dois pas être assez doué car à ce qu’il paraît on devrait pouvoir y arriver.

Ce workflow devrait permettre de faire les choses suivantes :

1) sélectionner manuellement les dossiers dont le workflow va s’occuper ou indiquer le dossier initial dont le workflow va traiter tous les sous-dossiers

2) regarder dans tous les dossiers concernés, et leurs sous-dossiers, afin de constater si des archives s’y trouvent

3) si ce n’est pas le cas passer automatiquement au contrôle du dossier suivant

4) si c’est le cas désarchiver toutes les archives présentent et placer le fichier d’archives initial à la corbeille (sans vider cette dernière)

5) après chaque désarchivage contrôler l’espace restant sur le disque dur et si l’espace restant est supérieur à 70 Go continuer avec le désarchivage, si il est inférieur à 70 Go stopper la procédure et demander à l’utilisateur si il désire vider la corbeille (proposer un menu avec deux choix)

6) si l’utilisateur choisi Non -> quitter le workflow

7) si l’utilisateur choisi Oui -> vider la corbeille et afficher l’espace restant sur le disque dur après avoir effacer les fichiers se trouvant dans la corbeille

8) proposer à l’utilisateur ou de continuer la procédure en cours ou de quitter le workflow



Si quelqu'un pouvait m'aider à établir ce workflow cela serait super :)
 

zeltron54

Membre d’élite
29 Mars 2008
1 622
247
Lorraine
Bonjour,
Cela doit pouvoir se faire avec un applescript, par contre la vérification de l'espace sur le disque à chaque fichier va te prendre un temps fou... A te place je réaliserai en plusieurs fois (tu as 4 dossiers) et je vérifierai à la fin de chaque morceaux.

je peux regarder pour te réaliser un script qui te ferais les étapes 1 à 4 .
 

Kersey

Membre junior
30 Octobre 2008
10
0
Bonjour,
Cela doit pouvoir se faire avec un applescript, par contre la vérification de l'espace sur le disque à chaque fichier va te prendre un temps fou... A te place je réaliserai en plusieurs fois (tu as 4 dossiers) et je vérifierai à la fin de chaque morceaux.

je peux regarder pour te réaliser un script qui te ferais les étapes 1 à 4 .

C'est super sympa Zeltron, merci beaucoup pour ton aide. Si les étapes 5 à 8 prennent trop de temps on peut bien les laisser tomber sans trop de problème, j'ai qu'à faire un peut plus attention à l'espace disque restant avant de lancer le désarchivage ;-)
 

zeltron54

Membre d’élite
29 Mars 2008
1 622
247
Lorraine
Avant de faire un script, je viens de tester avec "The unarchiver" Qui semble faire ce que tu veux. En suivant ces étapes.

1 - dans les préférences de the unarchiver --> onglet extraction cocher la case placer l'archive dans la corbeille.
2 - Ouvrir un des dossiers contenant les fichiers à décompresser.
3 - faire un cmd + F --> ce qui ouvre une fenêtre de recherche
4 - dans la recherche: -->Rechercher: sélectionne ton dossier puis dans type est archive (si archive n'apparaît pas choisir autres et cocher archive)
5 - faire un cmd + a (tout sélectionner) et glisser l'ensemble des fichier sur l'application The unarchiver
6 - patienter jusqu'à la fin du traitement par l'appli.

Chez moi cela fonctionne, si problèmes on envisagera un script...
 

Kersey

Membre junior
30 Octobre 2008
10
0
Avant de faire un script, je viens de tester avec "The unarchiver" Qui semble faire ce que tu veux. En suivant ces étapes.

1 - dans les préférences de the unarchiver --> onglet extraction cocher la case placer l'archive dans la corbeille.
2 - Ouvrir un des dossiers contenant les fichiers à décompresser.
3 - faire un cmd + F --> ce qui ouvre une fenêtre de recherche
4 - dans la recherche: -->Rechercher: sélectionne ton dossier puis dans type est archive (si archive n'apparaît pas choisir autres et cocher archive)
5 - faire un cmd + a (tout sélectionner) et glisser l'ensemble des fichier sur l'application The unarchiver
6 - patienter jusqu'à la fin du traitement par l'appli.

Chez moi cela fonctionne, si problèmes on envisagera un script...

Un grand merci pour ta rapide réponse mais le problème c'est que je dois d'abord sélectionner les fichiers à désarchiver et vu qu'il y a un nombre considérable de fichier, et pas juste quelques dizaines d'entre eux, cela me prendrais beaucoup trop de temps, et cela même si je passais par un affichage en mode liste puisque dans ce cas j'aurais eu à chaque fois à cliquer sur le petit triangle de gauche pour afficher les archives présente dans le dossier. L'idéal aurait été que "The Unarchiver" accepte que l'on fasse glisser l'ensemble des dossiers contenant les archives à décompresser sur son icône et décompresse alors automatiquement les archives présentent dans ces dossiers. Mais hélas cela ne fonctionne pas le programme ne réagissant que si l'on fait glisser les archives à décompresser sur son icône et pas les dossiers les contenant! Une personne m'a conseillé de transformer les dossiers contenant les archives en un seul dossier puis de glisser l'ensemble des fichiers s'y trouvant sur l'icône de "The Unarchiver" pour lancer leur désarchivage, mais hélas c'est pas possible car je perdrais alors mon classement ce que je ne peut pas me permettre. Si tu as une idée je suis preneur ;-)
 

zeltron54

Membre d’élite
29 Mars 2008
1 622
247
Lorraine
Je ne comprend pas ! lorsque tu fais une rechercher des fichiers type archive, dans le fenêtre il y a tous les fichiers archive du dossier et de ses sous dossier , et uniquement les fichiers archive, donc un tous sélectionner et un un glisser déposer est donc possible directement.

Relis bien ma réponse précédente et applique le tuto points 1 à 5 ...
 
Dernière édition:
  • J’aime
Réactions: baron

zeltron54

Membre d’élite
29 Mars 2008
1 622
247
Lorraine
Pour ta recherche,(point 4 du tuto), tu peux aussi la faire sur l'extension du fichier, .zip, .rar ..... etc.
A ce propos, pour écrire le script j'ai besoin toutes les extensions des fichiers que tu souhaites décompresser. (écriture en cours, mais je suis persuadé que la méthode décrite ci-dessus fonctionne et est bien plus simple.)
 

zeltron54

Membre d’élite
29 Mars 2008
1 622
247
Lorraine
Une première version de script qui vérifie l'espace libre du disque.
les extensions traitées son : "zip", "rar", "7z", "zipx", "sit", "gzip", "tar" que tu peux compléter ou modifier.
la valeur mini du disque et 70 Go que tu peux modifer dans la ligne : if free > 70 then
Le script doit être lancé sur un disque ayant plus de 70 Go de libre au départ.
Le script envoi les fichiers à "the unarchiver" et continu sans attendre la fin de la décompression. Donc bien attendre la fermeture de la fenêtre de "the unarchiver" à la fin.

Bloc de code:
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à décompresser"
    my inspecter(chemin)
end tell

on inspecter(un_dossier)
    tell application "Finder"
      
        set lesextensions to {"zip", "rar", "7z", "zipx", "sit", "gzip", "tar"} -- liste des extensions a traiter
        set retour to ""
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
          
            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
              
                if lextension is in lesextensions then
                    set fich to chaque_fichier as string
                  
                    set lefich to quoted form of POSIX path of fich
                    set command to "df -g " & lefich
                    set place to do shell script command
                    set place to place as string
                    set free to word 16 of place
                    set free to free * 1.075
                  
                    if free > 70 then -- controle si espace libre est supérieur à 70 Go
                        my decompresse(fich, chaque_fichier)
                    else
                        display dialog "Espace disque libre " & free & " Go !  Vider la corbeille ?" buttons {"Non", "Oui"}
                        set retour to button returned of result
                      
                        if retour is "Non" then
                            exit repeat
                        else
                            empty trash
                            my decompresse(fich, chaque_fichier)
                        end if
                    end if
                end if
            end tell
        end repeat
      
      
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            if retour is "Non" then
                exit repeat
            end if
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter

on decompresse(fich, chaque_fichier)
    tell application "The Unarchiver"
        open fich
        close
    end tell
    delete chaque_fichier
end decompresse

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
Dernière édition:
  • J’aime
Réactions: Kersey

zeltron54

Membre d’élite
29 Mars 2008
1 622
247
Lorraine
Une deuxième version sans la vérification de l'espace libre sur le disque...

Bloc de code:
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier contenant les fichiers à décompresser"
    my inspecter(chemin)
end tell

on inspecter(un_dossier)
    tell application "Finder"
       
        set lesextensions to {"zip", "rar", "7z", "zipx", "sit", "gzip", "tar"} -- liste des extensions a traiter
       
        set les_fichiers to files of un_dossier
        repeat with chaque_fichier in les_fichiers
           
            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
               
                if lextension is in lesextensions then
                    set fich to chaque_fichier as string
                   
                    tell application "The Unarchiver"
                        open fich
                        close
                    end tell
                    delete chaque_fichier
                   
                end if
            end tell
        end repeat
       
       
        -- traitement des dossiers :
        set les_dossiers to folders of un_dossier
        repeat with chaque_dossier in les_dossiers
            -- traitement d'un dossier
            my inspecter(chaque_dossier)
        end repeat
    end tell
end inspecter

tell application "Finder"
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
  • J’aime
Réactions: Kersey

Kersey

Membre junior
30 Octobre 2008
10
0
Un tout grand merci pour ton aide et pour tout le temps que tu as pris pour m'aider :)
 
Dernière édition: