Comment exécuter un script shell avec des fichiers / dossiers sélectionnés dans le Finder?

13

Je viens de Linux où il est facile d'exécuter un script sur un ensemble de fichiers dans nautilus ou dolphin, mais j'ai été un peu surpris de voir que ce n'est pas facile dans OSX.

De préférence, j'aimerais pouvoir cliquer sur une sélection dans le Finder, choisir mon script et faire apparaître une fenêtre de terminal pour montrer la progression ou toute interaction de l'utilisateur.

Jeremy Cantrell
la source

Réponses:

8

La manière la plus simple et intégrée de le faire est de simplement faire glisser les éléments du Finder vers une fenêtre de terminal . Lorsque vous les déposez, Terminal «tape» leurs noms de chemin (d'échappement). Vous pouvez ensuite utiliser la modification de la ligne de commande de votre shell pour entrer le reste de la commande. Ou si vous pensez à l'avance, vous pouvez d'abord taper la commande puis faire glisser les éléments.

La version «drag first»:

  1. Sélectionnez et faites glisser certains éléments du Finder vers une fenêtre de terminal qui affiche une invite de shell. Le terminal insérera les chemins d'accès (échappés).
  2. Tapez Control+ A(allez au début de la ligne; ⌃A est la valeur par défaut, mais varie selon le shell / la configuration).
  3. Tapez votre commande et un espace (il sera inséré avant les chemins d'accès).

La version «anticiper»:

  1. Dans n'importe quel ordre, faites les deux:
    • Dans une fenêtre de terminal , saisissez la partie initiale de votre commande et de votre espace (tout sauf les noms de chemin).
    • Sélectionnez certains éléments dans le Finder .
  2. Faites glisser les éléments sélectionnés du Finder vers la fenêtre Terminal où vous avez tapé la commande.
  3. Activez la fenêtre Terminal et appuyez sur Return.

Vous pouvez (comme d'autres réponses l'ont indiqué) vous tourner vers AppleScript ou Automator si vous avez besoin d'une solution plus automatisée. Étant donné que les «pièces mobiles» supplémentaires peuvent ajouter une certaine complexité à la solution, vous devrez peser les avantages du processus ci-dessus (manuel, mais flexible) par rapport à la complexité de la mise en œuvre d'une ou plusieurs des solutions automatisées.

Certaines des possibilités d'automatisation comprennent:

  • une application de droplet AppleScript
  • un programme AppleScript simple lancé par le menu de script intégré ou un autre lanceur
    • obtenir les chemins d'accès à partir de la sélection du Finder
  • un workflow Automator, une application ou un plug-in Finder
  • un .commandfichier exécutable (généralement un script shell; ouvrez-le dans le Finder pour l'exécuter dans Terminal )
    • obtenir les chemins d'accès à partir de la sélection du Finder (via osascript )
  • un outil tiers qui fournit déjà les fonctionnalités dont vous avez besoin
Chris Johnsen
la source
7

Je ne pense pas qu'il existe un moyen de le faire directement. Vous pouvez créer une application "Automator" qui fera ce que vous cherchez. Cela montre à quoi ressemblerait la pile Automator:

entrez la description de l'image ici

Enregistrez le résultat en tant qu'application, puis dans le Finder, sélectionnez les fichiers, faites un clic droit et sélectionnez "Ouvrir avec" puis choisissez votre application. (Vous devrez peut-être sélectionner "Autre ..." au bas de la liste des applications.)

Vous ne pouvez pas interagir avec le script avec cette méthode, mais vous pouvez parcourir les fichiers pour exécuter un script shell.

Peter Murray
la source
C'est encore plus facile si vous faites glisser les fichiers sur l'icône de l'application et les déposez.
kiamlaluno
5

Les services sont la façon dont gère ce genre de choses.

Sous le menu de l'application (dans ce cas «Finder»), il y a (presque) toujours une Servicesoption de menu qui fournira des services qui s'appliquent à l'application actuelle et à son état actuel. Généralement, l'état est le type d'objet sélectionné (texte, fichiers / dossiers, etc.).

Ils peuvent être activés, désactivés et assignés à des raccourcis clavier dans le panneau Préférences Système qui n'a de sens que pour le dernier de ces trois Keyboard,.

Raccourcis clavier

Pour créer un service qui applique un script shell aux fichiers / dossiers du Finder:

Lancez l' et créez un nouveau Servicetype de document.

Nouveau service

  • définir le type d'objet auquel le service s'applique ( files or folders)
  • définir l'application dans laquelle le service est disponible ( )
    • Alternativement, il y a une Get Selected Finder Itemsaction.
  • ajouter une action de Run Shell Script
  • décidez si vous voulez l'entrée comme arguments ou

Ça devrait ressembler a quelque chose comme ca:

exemple de script shell

placera automatiquement dans votre ~/Library/Servicesdossier lorsque vous l'enregistrerez, ce qui le rendra disponible (presque) immédiatement via le Application -> Servicesmenu ou le menu contextuel (clic droit).

dossiers de test

document TextEdit résultant

Lac
la source
1

Sous Mac OS X, le langage de script préféré est Applescript. Vous pouvez créer une droplet (un script qui fera quelque chose lorsque vous déposez des fichiers sur son icône), placer l'icône du script (qui peut être enregistré en tant qu'application) sur le bureau, et faire glisser et déposer les fichiers que vous souhaitez transmettre à la scénario.

Vous pouvez également utiliser des actions de dossier. Il est possible d'associer un script Applescript à un dossier qui sera exécuté à chaque fois que certains fichiers (ou répertoires) sont déposés sur le dossier.

kiamlaluno
la source
1

Je voulais aussi le faire, mais contrairement aux solutions ci-dessus, je voulais produire des paramètres cités pour un script shell. Ces autres méthodes sont très bien, mais elles sont un peu comme suggérer "juste commande-v dans le terminal" quand ce que vous voulez vraiment pbpaste.

Je voulais créer une fonction shell que je peux utiliser dans mes scripts, qui s'est étendue aux paramètres de fichier pour chaque sélection du Finder. J'utilise la coquille de poisson et cela semble fonctionner quelque peu:

function selection
    osascript -e "tell application \"Finder\" to set s to the selection as alias list" -e "repeat with f in s" -e "set contents of f to POSIX path of f" -e "end repeat" -e "set AppleScript's text item delimiters to linefeed" -e "s as string"
end

Utilisé (encore une fois dans la coquille de poisson) comme convert-video (selection).

Dans une fonction bash, il peut être nécessaire de citer la sortie avec quelque chose comme | tr '\n' '\0' | xargs -0 printf "%q" {}à la fin de cette commande osascript, pas sûr.

(Remarque: tout ce que je sais sur les scripts avancés de script et de shell j'ai ré-appris au cours des 2 dernières heures et j'oublierai demain)

Pierre Houston
la source
J'essayais de faire cela dans bash récemment, a échoué, a demandé ici superuser.com/questions/1353966 , a obtenu des réponses qui indiquent: non, pas possible: ^ (Bash vous perdez, je vais également passer à la coquille de poisson sur mon travail Mac. Remarque que j'utilise beaucoup le truc du glisser-trouver mentionné par Chris Johnsen ci-dessus.
Pierre Houston
1

Sur la base des réponses ci-dessus, j'ai construit ce truc

https://github.com/commonpike/DropShell

Fondamentalement, une application applescript qui appelle un fichier shell situé dans l'application avec les fichiers déposés comme arguments. Vous pouvez modifier le script shell selon vos besoins.

pic commun
la source
0

Sur la base de la réponse de commonpike, j'ai créé un AppleScript, qui redirige tous les fichiers déposés dessus, vers un script shell avec le nom correspondant. Enregistrez simplement en tant qu'application dans ScriptEditor d'Apple et renommez-le en script.app pour correspondre à votre script.sh https://github.com/PHolker/scripts/blob/master/DropScript.scpt

PHolker
la source