Commande AppleScript pour zipper un dossier

jeeeeerome

Membre confirmé
19 Septembre 2022
15
1
48
Bonjour les experts et amateurs en AppleScript du forum :)

Je me suis mis à AppleScript depuis quelques semaines et je me débrouille aujourd'hui plutôt pas mal pour tous les besoins que j'ai pour automatiser les tâches répétitives avec ce fabuleux language.

Il y a cependant une commande que j'ai du mal à trouver dans mes recherches :
c'est la fonction qui me permet de simplement zipper (ou compresser) un dossier pour l'intégrer dans ma programmation.

J'ai trouvé plusieurs réponses sur des forums seulement en anglais qui emploient des commandes du style

do shell script "zip -r " & zipFile & " " & itemPath
ou
cmdStr to "ditto -c -k " & quoted form of sourcePosixPath & space & quoted form of destPosixPath do shell script cmdStr
ou
do shell script "cd " & the_src & ";zip -r " & the_dest & " *"
etc...

(extraits sans le contexte et en vrac mais je n'arrive pas à identifier clairement ce qu'il y a de particulier que je peux reprendre dans mon script)

Je ne la trouve pas non plus dans le dictionnaire mais j'ai peut-être mal cherché car la recherche avec le dictionnaire est aussi un point que je ne maitrise pas encore totalement.

Il s'agit d'avoir un dossier sous cette forme :

à partir d'un dossier "XXXXXX" qui se trouverait sur le bureau par exemple
création de la compression sous forme de fichier zip --> "XXXXXX.zip"
un peu comme la fonction : control-clic --> compresser "XXXXXX" qui ne changerait rien à l'arborescence du dossier.

Pour le reste, je sais faire.

Merci de votre attention

Jérôme
 
Bonjour,
Il n'y a pas de commande applescript pour zipper des fichiers/dossier
Il faut donc passer par une commande bash (unix) dans le terminal.
cette commande est "do shell script ....."
je te met un script qui compresse le dossier choisi. J 'ai mis un commentaire à chaque ligne afin de comprendre le principe.

Dis moi si c'est bien ce que tu cherches !

Bloc de code:
tell application "Finder"
    set chemin to choose folder with prompt "Sélectionnez le dossier à compresser" --choisir le dossier à compresser
    set nom to name of chemin -- obtient le nom du dossier choisi
    
    set chemindossier to quoted form of (POSIX path of chemin) -- met le chemin au format unix
    
    set cheminzip to container of chemin as alias -- obtient le chemin du dossier contenant le dossier à compresser
    set chemindossierzip to (quoted form of (POSIX path of cheminzip & nom & ".zip")) --met le chemin au format unix et ajoute le nom du fichier pour sortie (nom du dossier.zip)
    
    do shell script "/usr/bin/ditto -c -k -rsrc " & chemindossier & " " & chemindossierzip --execute commande terminal
    
end tell
 
Bonjour Zeltron54

Merci beaucoup
J'aurais eu du mal à le trouver tout seul.

Effectivement ça marche très bien sous cette forme en passant par la commande "choose folder" et les explications sur le côté sont très claires.

Il me reste juste un tout petit problème pour pouvoir l'utiliser correctement dans ma boucle repeat qui me permet de zipper chaque dossier en boucle, probablement dû à mon encore jeune amateurisme :

Le problème survient lorsque je l'insère simplement dans une boucle repeat en passant par une commande indiquant le dossier sur le bureau et non par une commande "choose folder", comme ceci :

tell application "Finder"
set dossier_livraison to folder "dossier_contenant_les_dossiers_a_zipper" of desktop --le dossier contenant les dossiers à traiter
set tous_les_dossiers_livraison to every folder of dossier_livraison -- les dossiers à traiter pour la boucle

repeat with dossier_a_zipper in tous_les_dossiers_livraison
set nom to name of dossier_a_zipper -- obtient le nom du dossier choisi
set chemindossier to quoted form of (POSIX path of dossier_a_zipper) -- met le chemin au format unix
set cheminzip to container of dossier_a_zipper as alias -- obtient le chemin du dossier contenant le dossier à compresser
set chemindossierzip to (quoted form of (POSIX path of cheminzip & nom & ".zip")) --met le chemin au format unix et ajoute le nom du fichier pour sortie (nom du dossier.zip)
end repeat

end
tell

Le script bute sur la 2e ligne concernant le chemin au format unix.
Comme si l'information donnée par la commande choose folder était plus claire que la localisation précise du dossier contenant les dossiers à zipper sur le bureau.
Peut-être faut-il faire une conversion de l'adresse du dossier (ou des dossiers à l'intérieur) dans un format particulier avant (alias, posix, etc...)?

Peux-tu m'éclairer sur cet ultime détail?
 
bonjour,
Comment saisis-tu le chemin du dossier dans ta ligne: ?

set dossier_livraison to folder "dossier_contenant_les_dossiers_a_zipper" of desktop --le dossier contenant les dossiers à traiter

quel est le texte qui remplace "dossier_contenant_les_dossiers_a_zipper" ?
c'est un chemin renseigné sous quel format ?

Edit: Si j'ai bien compris ce que tu veux faire:
Compresser chaque dossier qui se trouve dans un dossier sur le bureau...
Je l'ai appelé "dossier sans titre" à modifier avec le nom de ton dossier
le script devient
Bloc de code:
tell application "Finder"
    set dossier_livraison to ((path to desktop folder as text) & "dossier sans titre") as alias --le dossier contenant les dossiers à traiter
    set tous_les_dossiers_livraison to every folder of dossier_livraison -- les dossiers à traiter pour la boucle
 
    repeat with dossier_a_zipper in tous_les_dossiers_livraison
     
        set nom to name of dossier_a_zipper -- obtient le nom du dossier choisi
        set a to dossier_a_zipper as string --met le chemin au format texte dans la variable a
        set chemindossier to quoted form of (POSIX path of a) -- met le chemin au format unix
        set cheminzip to container of dossier_a_zipper as alias -- obtient le chemin du dossier contenant le dossier à compresser
        set chemindossierzip to (quoted form of (POSIX path of cheminzip & nom & ".zip")) --met le chemin au format unix et ajoute le nom du fichier pour sortie (nom du dossier.zip)
        do shell script "/usr/bin/ditto -c -k -rsrc " & chemindossier & " " & chemindossierzip --execute commande terminal
     
    end repeat
 
end tell
 
Dernière édition:
Hé bien pour moi la variable dossier_livraison indique l'emplacement du dossier sur le bureau.
Ca marche très bien pour tous les scripts que j'ai fait jusqu'à présent qui allaient chercher ce dossier au bon endroit, alors ça ne me posait pas de problème jusque là. Je ne sais pas en quel format mais ça fonctionne tout de même...
le texte qui remplace "dossier_contenant_les_dossiers_a_zipper" est le vrai nom du dossier sur le bureau soit "LIVRAISON ZIP". Je l'ai renommé pour plus de compréhension.

Par contre il est vrai que je ne maitrise pas très bien encore les différences entre les commandes Posix, Alias, Path, Path to, etc... relatives au chemin des dossiers et que c'est ça qui posait problème semble-t-il.
Je dois me pencher dessus et trouver des informations claires sur ce point, je vois bien que c'est important et c'est pour ça que je ne trouvais pas la faille pour adapter comme il faut ton script pourtant très clair.

Tu as très bien compris ce que je voulais faire et ton dernier script marche à merveille, je peux maintenant l'intégrer dans mon process plus complet.

Vraiment un grand merci pour ton aide, rapide qui plus est ;)
 
content pour toi ! ;)
 
  • J’aime
Réactions: jeeeeerome