# Commande Terminal sur un dossier depuis finder



## modhack (13 Novembre 2021)

Bonjour,

Je souhaiterais pouvoir effectuer la commande terminal suivante en ayant un raccourcis depuis finder si je fais un clcik droit sur le dossier.


```
mqsquashfs "./le nom du dossier" "le nom du dossier.squashfs" -comp zstd
```

Simple a mettre en place ?
Merci bcp pour votre aide


----------



## zeltron54 (13 Novembre 2021)

Bonjour,

Avec automator, créer un service (qui s'appelle action rapide).
Dans automator 1 action --> Exécuter un script shell et y coller ta commande.


----------



## modhack (13 Novembre 2021)

Merci mais comment mettre en argument le nom du dossier ?


----------



## zeltron54 (13 Novembre 2021)

Si tu crées une action lors du clic droit sur le dossier, le dossier est passé en argument à la commande. Tu as juste besoin d'entrer la commande dans le script !


----------



## modhack (13 Novembre 2021)

J'essaye de comprendre, mais je vois pas.
La commande va squashfs le dossier, et doit utiliser le nom de dossier comme nom de fichier .squash 

Il faut bien que j'ai la variable "nom du dossier" pour que je puisse la coller dans les 2 endroits de la commande terminal


----------



## zeltron54 (13 Novembre 2021)

Mais as-tu vérifié si cette commande existe sur macOS, il me semble que c'est une commande purement linux ?
cette commande est censée faire quoi ?

Que veux-tu faire exactement ?


----------



## modhack (13 Novembre 2021)

zeltron54 a dit:


> Mais as-tu vérifié si cette commande existe sur macOS, il me semble que c'est une commande purement linux ?
> 
> Que veux-tu faire exactement ?



Oui c'est une commande linux (installée via brew) et je l'utilise tous les jours , j'aimerais juste automatiser l'ajout du nom de dossier et de pouvoir le faire depuis le finder.

la commande que j'ai montré plus haut va creer une image squashfs (l'équivalent d'un .iso par ex) du dossier. Pour cela je lui indique "le path du dossier", "le nom du fichier" en sortie (.squashfs) et la méthode de compression  "-comp zsdt"


----------



## zeltron54 (13 Novembre 2021)

Cette commande n'étant pas installé sur mes machines, je ne peux pas tester.

Le principe d'un service (via le clic droit) est d' exécuter le script qui suit, au dossier sur lequel le clic droit à été exécuté !


----------



## modhack (13 Novembre 2021)

ca ne sera pas adapté alors. Il faut que je me tourne vers une autre solution


----------



## zeltron54 (13 Novembre 2021)

Peut être un applescript !
Tu veux que lors d"un clic droit sur un dossier, tu choisisses ton service, et que cela te demande de saisir le nom du fichier de sortie et le mode de compression ?
c'est bien cela ?


----------



## modhack (13 Novembre 2021)

Si par service tu entends le binaire de squashfs oui c'est bien ca, mais il faudrait que le nom du fichier de sortie soit automatiquement nommé comme le nom du dossier (le mode de compression sera toujours le meme)


----------



## modhack (13 Novembre 2021)

En faite j'imaginais qu'en faisant un clique droit sur le dossier ca prends la variable $nom-du-dossier
Et ensuite cela lance dans un terminal :  mquashfs "./$nom-du-dossier" "$nom-du-dossier.squashfs" -comp zsdt


----------



## zeltron54 (13 Novembre 2021)

Cela doit pouvoir se faire avec un applescript qui sera exécuté dans une action automator.

En gros, lors du clic droit sur ton dossier, tu vas dans service et tu choisis ton service.
Dans automator on récupère le path du dossier, et on le transmet à un applescript qui exécute ta commande avec en paramètre le path du dossier, le nom du fichier qui sera formé avec le nom du dossier plus l'extension ".squashfs" et le mode de compreesion. "-comp zstd"


----------



## zeltron54 (13 Novembre 2021)

Pour tester!

Dans automator tu fais nouveau document  et tu choisis (action rapide)
Dans la fenêtre qui s'ouvre tu modifie l'action qui est là comme la capture d'écran ci-dessous






et je te met le script pour pouvoir faire un copié collé.

```
on run {input, parameters}
    set ledossier to input as string
    set aa to ledossier as string
    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
    set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
    set nomcourt to (text item -2 of aa) as string
    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
    set guil to ASCII character 34
    display dialog "mqsquashfs " & guil & quoted form of POSIX path of ledossier & guil & " " & guil & nomcourt & ".squashfs" & guil & " " & "-comp zstd"
    
    do shell script "mqsquashfs " & guil & quoted form of POSIX path of ledossier & guil & " " & guil & nomcourt & ".squashfs" & guil & " " & "-comp zstd"
    
    return input
end run
```

tu enregistres sous le nom qui te conviens
(le chemin d'enregistrement est automatique--> dans ta bibliothèque utilisateur dans le dossier services)

Et tu pourras faire un essai : le script t'affiche a l'écran la commande qu'il va envoyer au terminal (c'est pour que tu puisses vérifier), tu valides et c'est tout.

si c'est bon , il suffira de supprimer l'affichage en supprimant la ligne:
display dialog "mqsquashfs " & guil & ledossier & guil & " " & guil & nomcourt & ".squashfs" & guil & " " & "-comp zstd"

ne connaissant pas la syntaxe de ta commande, j’ai juste renseigné le nom du fichier de sortie, il faut peut être le path complet ?

Edit: je viens de remplacer le script à copier coller (qui sera donc différent de la capture d'écran) car j'avais laissé le chemin du dossier au format macOS (séparateur=  au lieu du format Unix (séparateur = /).


----------



## modhack (13 Novembre 2021)

C'est top de ta parts  on est pas loin , j'ai du modifier le path car sinon il reconnait pas le chemin de la commande mksquashfs


```
on run {input, parameters}
    set ledossier to input as string
    set aa to ledossier as string
    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
    set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
    set nomcourt to (text item -2 of aa) as string
    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
    set guil to ASCII character 34
    display dialog "mksquashfs " & guil & quoted form of POSIX path of ledossier & guil & " " & guil & nomcourt & ".squashfs" & guil & " " & "-comp zstd"
    
    do shell script "/opt/homebrew/Cellar/squashfs/4.5/bin/mksquashfs " & guil & quoted form of POSIX path of ledossier & guil & " " & guil & nomcourt & ".squashfs" & guil & " " & "-comp zstd"
    
    return input
end run
```

Le pb maintenant c'est qu'il me donne le path complet du dossier, hors, juste le ./ suffit dans la commande, et c'est meme nécessaire car sinon ca sera pas possible de le monter sur d'autres systemes.


----------



## zeltron54 (13 Novembre 2021)

Ok peux-tu me donner une exemple de chemin?
Ou mieux un exemple complet de commande, je modifierai le script !


----------



## modhack (13 Novembre 2021)

Puis ca bloque dessus


```
L’action « Exécuter un script AppleScript » a rencontré une erreur : « Cannot stat source directory "'/Volumes/share/le-dossier-a-squash/'" because No such file or directory »
```


----------



## zeltron54 (13 Novembre 2021)

Donne moi la commande exacte telle que tu la met dans le terminal et qui fonctionne !
je ferais les modifs...


----------



## modhack (13 Novembre 2021)

Je dois me placer au niveau du dossier ou se trouve le dossier que je souhaite squash
Ensuite je fais cela (avec le path complet)


```
/opt/homebrew/Cellar/squashfs/4.5/bin/mksquash "./mondossier" "mondossier.squashfs" -comp zsdt
```


----------



## zeltron54 (13 Novembre 2021)

nouveau script
a essayer


```
on run {input, parameters}
    set ledossier to input as string
    set aa to ledossier as string
    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
    set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
    set nomcourt to (text item -2 of aa) as string
    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
    set guil to ASCII character 34
    
    set macommande to "/opt/homebrew/Cellar/squashfs/4.5/bin/mksquash " & guil & "./" & nomcourt & guil & " " & guil & nomcourt & ".squashfs" & " " & "-comp zstd"
    display dialog macommande
    
    do shell script macommande
    
    return input
end run
```


----------



## modhack (13 Novembre 2021)

```
L’action « Exécuter un script AppleScript » a rencontré une erreur : « sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file »
```


----------



## zeltron54 (13 Novembre 2021)

A l'affichage de la commande , est-elle correcte ? pour toi !


----------



## zeltron54 (13 Novembre 2021)

AH !
il manque les guillemets à la fin du nom du fichier ...
difficile quand on peut pas tester LOL!


```
on run {input, parameters}
    set ledossier to input as string
    set aa to ledossier as string
    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
    set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
    set nomcourt to (text item -2 of aa) as string
    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
    set guil to ASCII character 34
   
    set macommande to "/opt/homebrew/Cellar/squashfs/4.5/bin/mksquash " & guil & "./" & nomcourt & guil & " " & guil & nomcourt & ".squashfs" & guil  & " " & "-comp zstd"
    display dialog macommande
   
    do shell script macommande
   
    return input
end run
```


----------



## modhack (13 Novembre 2021)

on progresse 

reste encore un pb de path

```
L’action « Exécuter un script AppleScript » a rencontré une erreur : « Cannot stat source directory "./mon dossier a squash" because No such file or directory »
```


----------



## zeltron54 (13 Novembre 2021)

Il trouve pas le dossier !

Tu lances bien le script en faisant un clic droit sur le dossier et en choisissant le service?
Et la commande affichée est-elle correcte ?
Tu es sur qu'il ne faut pas le chemin complet du dossier ?

Encore un faute vue le mode de compilation est zstd au lieu de zsdt


```
on run {input, parameters}
    set ledossier to input as string
    set aa to ledossier as string
    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
    set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
    set nomcourt to (text item -2 of aa) as string
    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
    set guil to ASCII character 34
    
    set macommande to "/opt/homebrew/Cellar/squashfs/4.5/bin/mksquash " & guil & "./" & nomcourt & guil & " " & guil & nomcourt & ".squashfs" & guil  & " " & "-comp zsdt"
    display dialog macommande
    
    do shell script macommande
    
    return input
end run
```


----------



## modhack (13 Novembre 2021)

Je veux bien essayer avec le chemin complet mais j'ai peur que ca passe pas pour l'utilisation. Car je vais utiliser ce squashfs sur un autre system, qui lui voudra lire dans le dossier ou il se trouve. Si je colles un path complet dans l'image ca va poser pb


----------



## modhack (13 Novembre 2021)

et bien vu c'est bien zstd


----------



## zeltron54 (13 Novembre 2021)

Et ? çà fonctionne toujours pas ?
les réponses à ces questions si on veux avancer.


zeltron54 a dit:


> Tu lances bien le script en faisant un clic droit sur le dossier et en choisissant le service?
> Et la commande affichée est-elle correcte ?


----------



## modhack (13 Novembre 2021)

oui je fais bien ca et la commande est correcte


----------



## zeltron54 (13 Novembre 2021)

et il y a toujours une erreur ?
Fais un autre test, fais un copie de la commande qui s'affiche puis fais un collé dans le terminal pour voir s'il le prend!


----------



## modhack (13 Novembre 2021)

```
L’action « Exécuter un script AppleScript » a rencontré une erreur : « Cannot stat source directory "./mon dossier" because No such file or directory »
```


----------



## zeltron54 (13 Novembre 2021)

Tu as fais le test ?


zeltron54 a dit:


> Fais un autre test, fais un copie de la commande qui s'affiche puis fais un collé dans le terminal pour voir s'il le prend!


 Si le terminal ne le prend pas on essaiera avec le chemin complet !


----------



## modhack (13 Novembre 2021)

propose moi le code avec le path complet pour que je test


----------



## zeltron54 (13 Novembre 2021)

il y aura le chemin complet uniquement pour le dossier, pas pour le fichier de sortie !


```
on run {input, parameters}
    set ledossier to input as string
    set aa to ledossier as string
    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
    set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
    set nomcourt to (text item -2 of aa) as string
    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
    set guil to ASCII character 34
    
    set macommande to "/opt/homebrew/Cellar/squashfs/4.5/bin/mksquash " & quoted form of POSIX path of ledossier & " " & guil & nomcourt & ".squashfs" & guil & " " & "-comp zsdt"
    display dialog macommande
    
    do shell script macommande
    
    return input
end run
```


----------



## modhack (13 Novembre 2021)

*L’action « Exécuter un script AppleScript » a rencontré une erreur : « Could not create destination file: Read-only file system »*

tu as une idée ?


----------



## zeltron54 (13 Novembre 2021)

A priori problème de chemin du fichier de sortie...
on va étudier çà...


----------



## zeltron54 (13 Novembre 2021)

Bon essai avec ce script qui met les chemins complets au dossier et au fichier de sortie


```
on run {input, parameters}
    set ledossier to input as string
    set aa to ledossier as string
    set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
    set AppleScript's text item delimiters to {":"} --récupère la partie avant le dernier "."
    set nomcourt to (text item -2 of aa) as string
    set cheminfichier to (text items 1 thru -3 of aa) as string
    set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
    set nomfichier to cheminfichier & ":" & nomcourt & ".squashfs"

    set guil to ASCII character 34
   
    set macommande to "/opt/homebrew/Cellar/squashfs/4.5/bin/mksquash " & quoted form of POSIX path of ledossier & " " &  quoted form of POSIX path of nomfichier  & " " & "-comp zsdt"
    display dialog macommande
   
    do shell script macommande
   
    return input
end run
```


----------



## modhack (13 Novembre 2021)

YES  la commande s'execute bien. Maintenant va falloir que je check si c'est ok coté soft


----------



## zeltron54 (13 Novembre 2021)

Dans le terminal sur mac os il faut bien les chemins complets.
Dans le script il sont fabriqués avec le chemin récupéré du dossier qui à lancé le script donc il ne devrait pas y avoir de problème !


----------



## zeltron54 (13 Novembre 2021)

pense à supprimer la ligne qui affiche le chemin ...

display dialog macommande


----------



## modhack (13 Novembre 2021)

il faut que mes gosses lachent la manette (yuzu mario party) pour que je puisse tester si le squashfs est bon mais merci infiniment pour le temps que tu as passé et avec du résultat surtout  c'est vraiment sympa d'avoir partagé ton experience


----------



## zeltron54 (13 Novembre 2021)

Content pour toi !

Si problème tu reposte ici ...


----------



## modhack (13 Novembre 2021)

Yes ca marche impec apparemment. Je dois encore le faire valider en dehors de mon env. mais c'est du bon boulot.
Next step la commande pour unsquashfs


----------



## modhack (14 Novembre 2021)

C'est top, cela fonctionne vraiment bien.
J'abuse un peu, mais j'aimerais pouvoir faire la meme chose en opération inverse. c-a-d unsquash le fichier .squashfs vers un nom de dossier. Cela devrait donner un truc comme ca

"/opt/homebrew/Cellar/squashfs/4.5/bin/unsquashfs -e "  "& nom court.squashfs"  -d " & nomdudossier"

En pratique on spécifie le path output avec l'argument "-d" et celui-ci doit avoir le meme nom que le fichier squash.

(option) est il possible d'avoir l'option pour afficher le terminal ou non dans l'execution du script ?


----------



## zeltron54 (14 Novembre 2021)

As-tu essayé ta ligne de commande directement dans le terminal pour être sur qu'elle soit correcte ?

Si oui j'essaierai de te la construire dans le script .


----------



## modhack (14 Novembre 2021)

oui cela fonctionne, mais je m'etais trompé dans la syntaxe.
voila la bonne commande :


```
/opt/homebrew/Cellar/squashfs/4.5/bin/unsquashfs -no -d "Le nom du dossier" "fichier.squashfs"
```

A savoir qu'il faut que le nom du dossier soit nommé comme le nom du fichier squashfs qui a servit comme input

Merci bcp


----------



## zeltron54 (14 Novembre 2021)

Bon alors!
créer une action automator comme capture écran ci-dessous .






Je te met le script...

```
on run {input, parameters}
    set lefichier to input as alias
    tell application "Finder"
        set ledossier to container of lefichier as string
        set lenom to name of lefichier
        set sauv to AppleScript's text item delimiters --sauvegarder la variable delimiteur
        set AppleScript's text item delimiters to {"."} --récupère la partie avant le dernier "."
        set elements to text items of lenom
        set nomcourt to (items 1 thru -2 of elements) as string
        set AppleScript's text item delimiters to sauv --restaurer la variable delimiteur
        set ledossier to ledossier & nomcourt
    end tell
   
    set macommande to "/opt/homebrew/Cellar/squashfs/4.5/bin/unsquashfs -no -d " & quoted form of POSIX path of ledossier  & " " & quoted form of POSIX path of lefichier
    display dialog macommande
   
    do shell script macommande
   
    return input
end run
```

Idem il t'affiche la commande qui va être envoyée (vérifie avant de validé !)


----------



## modhack (14 Novembre 2021)

Yes genial cela fonctionne bien


----------



## zeltron54 (14 Novembre 2021)

Ok !
comme pour l’autre pense à supprimer la ligne de l’affichage .
Content pour toi  !


----------

