How to execute a shell script with selected files/folders in finder?
Solution 1:
The easiest, built-in way to do this is to just drag the items from Finder to a Terminal window. When you drop them, Terminal will “type” their (escaped) pathnames. You can then use your shell's command line editing to enter the rest of the command. Or if you are thinking ahead, you can type the command first then drag in the items.
The “drag first” version:
- Select and drag some Finder items to a Terminal window that is showing a shell prompt. Terminal will insert the (escaped) pathnames.
- Type Control+A (go to the beginning of the line; ⌃A is the default, but varies by shell/configuration).
- Type your command and a space (it will be inserted before the pathnames).
The “thinking ahead” version:
- In any order, do both:
- In a Terminal window, type the initial part of your command and space (everything except the pathnames).
- Select some items in Finder.
- Drag the selected items from Finder to the Terminal window where you typed the command.
- Activate the Terminal window and press Return.
You can (as other answers have indicated) turn to AppleScript or Automator if you need more a more automated solution. Since the extra “moving parts” can add some complexity to the solution, you will have to weigh the benefits of the above process (manual, but flexible) against the the complexity of implementing one or more of the automated solutions.
Some of the automation possibilities include:
- an AppleScript droplet application
- a plain AppleScript program launched by the built-in script menu or other launcher
- get pathnames from Finder's selection
- an Automator workflow, application, or Finder plug-in
- an executable
.command
file (usually a shell script; open in Finder to run it in Terminal)- get pathnames from Finder's selection (via osascript)
- some third-party tool that already provides the functionality you need
Solution 2:
I don't think there is a way to do this directly. You can build an "Automator" application that will do some of what you are seeking. This shows what the Automator stack would look like:
Save the result as an Application, then in the finder select the files, right-click and select "Open with" then pick your application. (You may need to select "Other..." at the bottom of the application list.)
You don't get to interact with the script with this method, but you can loop over the files to perform some shell script.
Solution 3:
Services are how osx handles this sort of thing.
Under the Application Menu (in this case 'Finder') there is (almost) always a Services
menu option which will provide Services that apply to the current Application and its current state. Typically the state is what type of object is selected (text, files/folders, etc).
They can be enabled, disabled, and assigned keyboard shortcuts in the System Preferences panel that only makes sense for the last of those three, Keyboard
.
To make a Service that applies a shell script to files/folders in Finder:
Launch automator and make a new Service
type document.
- set the type of object the Service applies to (
files or folders
) - set the Application in which the Service is available (finder)
- Alternatively there is a
Get Selected Finder Items
action.
- Alternatively there is a
- add an action of
Run Shell Script
- decide if you want the input as arguments or stdin
It should look something like this:
automator will automatically place it in your ~/Library/Services
folder when you save which will make it available (almost) immediately via the Application -> Services
menu, or the contextual (right click) menu.
Solution 4:
Based on the answers above, I built this thingy
https://github.com/commonpike/DropShell
Basicly an applescript app that calls a shellfile located in the app with the dropped files as arguments. You can modify the shell script as needed.
Solution 5:
Based on commonpike's answer, I have created a AppleScript, that redirects all files dropped onto it, to a shell script with the matching name. Simply save as application from within Apple's ScriptEditor and rename as script.app to match your script.sh https://github.com/PHolker/scripts/blob/master/DropScript.scpt