web-dev-qa-db-fra.com

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

Je viens de Linux où il est facile de gérer un script contre un ensemble de fichiers à Nautilus ou à Dauphin, mais j'étais un peu surpris de voir que ce n'est pas facile dans OSX.

De préférence, j'aimerais pouvoir être capable de cliquer sur une sélection de la sélection dans Finder, choisissez mon script et une fenêtre de terminal apparaît pour afficher la progression ou toute interaction utilisateur.

13
Jeremy Cantrell

Le moyen le plus facile et intégré de le faire est de simplement faire glisser les éléments de -Finder à une fenêtre terminal. Lorsque vous les déposez, Terminal "Tapez" leurs noms de chemin (échappés). Vous pouvez ensuite utiliser l'édition de la ligne de commande de votre shell pour entrer le reste de la commande. Ou si vous pensez de l'avant, vous pouvez saisir la commande d'abord puis glisser dans les éléments.

La version "Drag d'abord":

  1. Sélectionnez et faites glisser certains Finder éléments à une fenêtre terminal Affichage d'une invite de shell. terminal Insérera les noms de chemin (échappés).
  2. Taper Control+A (Allez au début de la ligne; ^a est la valeur par défaut, mais varie en coquille/configuration).
  3. Tapez votre commande et un espace (il sera inséré avant les noms de chemin).

La version "pensant à venir":

  1. Dans n'importe quel ordre, faites les deux:
    • Dans une fenêtre A Terminal, tapez la partie initiale de votre commande et de votre espace (tout sauf les noms de chemin).
    • Sélectionnez des éléments dans Finder.
  2. Faites glisser les éléments sélectionnés de -Finder à la fenêtre Terminal La fenêtre où vous avez saisi la commande.
  3. Activez la fenêtre -Terminal et appuyez sur Return.

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

Certaines des possibilités d'automatisation incluent:

  • une application de gouttelettes AppleScript
  • un programme de AppleScript uni lancé par le menu de script intégré ou par un autre lanceur [.____]
    • obtenir des chemins de pathernes à partir de Finder Sélection
  • un flux de travail automatisent, application, ou Finder Plug-in
  • un exécutable .command Fichier (généralement un script shell; ouvert dans Finder pour l'exécuter dans terminal) [.____]
    • obtenir des chemins de pathernes à partir de Finder Sélection (via Osascript)
  • un outil tiers qui fournit déjà la fonctionnalité dont vous avez besoin
8
Chris Johnsen

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

enter image description here

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

Vous n'obtenez pas à interagir avec le script avec cette méthode, mais vous pouvez faire boucler les fichiers pour effectuer un script shell.

7
Peter Murray

Les services sont comment OSX gère ce genre de chose.

Dans le menu Application (dans ce cas "Finder"), il existe (presque) une option de menu Services qui fournira des services qui s'appliquent à l'application actuelle et ​​son état actuel. Typiquement, l'état est le type d'objet sélectionné (texte, fichiers/dossiers, etc.).

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

keyboard shortcuts

Pour créer un service qui applique un script shell à des fichiers/dossiers de Finder:

Lancement Automator et crée un nouveau document Service.

New Service

  • définissez le type d'objet que le service s'applique à (files or folders)
  • définissez l'application dans laquelle le service est disponible ( Finder ) [.____]
    • Sinon, il y a une action Get Selected Finder Items.
  • ajouter une action de Run Shell Script
  • décidez si vous souhaitez l'entrée comme arguments ou stdin

Ça devrait ressembler a quelque chose comme ca:

example Shell script

Automator le placera automatiquement dans votre dossier ~/Library/Services lorsque vous économisez, ce qui le rendra disponible (presque) immédiatement via le menu Application -> Services ou le contextuel (droit Cliquez) sur) menu.

test folders

resulting TextEdit document

5
Lake

Basé sur les réponses ci-dessus, j'ai construit cette chose

https://github.com/commonpike/dropshell

De fondement une application AppleScript qui appelle une coquillée située dans l'application avec les fichiers déposés comme arguments. Vous pouvez modifier le script shell au besoin.

2
commonpike

Basé sur la réponse de Commonpike, j'ai créé un AppleScript, qui redirige tous les fichiers qui l'ont déposé, à un script shell avec le nom correspondant. Enregistrez simplement en tant qu'application à partir de Script Scripditor et Renommez comme script.App pour correspondre à votre script.sh https://github.com/pholker/scripts/blob/master/dropscript.scpt

2
PHolker

Je voulais aussi faire cela aussi, mais contrairement aux solutions ci-dessus, je voulais produire des paramètres cités pour un script shell. Ces autres méthodes vont bien, mais ils sont un peu comme suggérant "juste commander-V dans le terminal" lorsque ce que vous voulez vraiment, c'est pbpaste.

Je voulais faire une fonction shell que je peux utiliser dans mes scripts étendus aux paramètres de fichier pour chaque sélection de recherche. 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é (à nouveau dans la coque 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 de AppleScript et Shell avancés J'ai ré-appris au cours des 2 dernières heures et oublieront de demain

1
Pierre Houston

Dans Mac OS X, la langue de script préférée est AppleScript. Vous pouvez créer une gouttelette (un script qui fera quelque chose lorsque vous déposez des fichiers sur son icône), placez le script (pouvant être enregistré en tant qu'application) icône sur le bureau et faites glisser les fichiers que vous souhaitez transmettre à la scénario.

Comme alternative, vous pouvez utiliser des actions de dossiers. Il est possible d'associer un AppleScript de script à un dossier qui sera exécuté toutes les fois que certains fichiers (ou répertoires) sont supprimés sur le dossier.

1
kiamlaluno

Depuis la découverte - FastScripts (que je recommande vivement), je cherche un moyen d'aller dans l'ensemble et de me débarrasser de l'automatiseur. Donc, je devais avoir un moyen de transmettre les éléments de recherche sélectionnés comme paramètres à la coquille.

Pour cela, j'ai créé un gestionnaire dans ma bibliothèque AppleScript Handlers.scpt dans ~/Library/Script Libraries qui renvoie la sélection en tant que pistes POSIX ou HFS, en fonction du Boolean passé.

on getselection(hfs)
    set text item delimiters to linefeed
    tell application "Finder" to set sel to text items of (selection as text)
    if hfs then return sel
    repeat with i in sel
        set contents of i to POSIX path of i
    end repeat
    return sel as text
end getselection

De mon script Bash, j'ai lu le résultat du gestionnaire à un tableau. Je passe false parce que j'ai besoin de pistes de POSIX. Le script sort lorsque le premier élément de la matrice est vide.

#!/usr/local/bin/bash
mapfile -t i < <(osascript -e 'tell script "Handlers" to getselection(false)')
[[ $i ]] || exit 0

whatever-command "${i[@]}"
0
Daan