One of the new macOS features in Mojave are “Finder Quick Actions.”
They show as action buttons in the Finder in Column View and the new Gallery View. You can also access Quick Actions in any view from an item’s context menu.
You can configure Quick Actions in the ‘Finder’ section of the ‘Extensions’ Preference Pane. The four sample actions that come with Mojave are ‘Rotate,’ ‘Markup,’ ‘Create PDF,’ and ‘Trim’. While these are certainly useful, they are oriented towards media.
You can, however, build your own Quick Actions with Automator!
When you look at it closely, Quick Actions are re-branded Automator Service Workflows. They are even stored in ~/Library/Services
.
Let’s build a useful Quick Action for admins.
Quick Packaging
Recap: You can quickly build an installer package from an application bundle with pkgbuild
:
$ pkgbuild --component /Applications/Firefox.app Firefox-63.0.pkg
This even works when the application is not installed on the current system, but then you have to add the --install-location
argument:
$ pkgbuild --component /Volumes/Firefox/Firefox.app/ --install-location /Applications Firefox-63.0.pkg
This allows you to build an installer package from a disk image without having to install it.
Note: this method works well with ‘drag to install’ type applications. For many other applications, re-packaging is more elaborate. Learn all the details of packaging in my book: “Packaging for Apple Adminstrators”
To make this simple process even simpler, I wrote a small script a while back called quickpkg
, which simplifies this even further:
$ quickpkg "~/Downloads/Firefox 63.0.dmg"
(For help with downloading and installing scripts like quickpkg
see this post.)
This seems like a good candidate for a Quick Action.
Bring in the Robot
Open the Automator application and create a new Workflow. Choose “Quick Action” as the type of Workflow.
This will present an empty workflow window with a list of categories and actions on the left and the area where you assemble the workflow on the right. Above the workflow area is a panel where you define the input for our Quick Action. Change the popups to match this image:
Then add a ‘Run Shell Script’ action from the list on the left. The easiest way to locate the action is with the search box, or you can find the ‘Run Shell Script’ action in the ‘Utilities’ category. Drag it to the workflow area, labelled ‘Drag actions or file here to build your Workflow.’
Make sure that the shell popup is set to /bin/bash
and the ‘Pass input’ popup is set to ‘to stdin’. With these settings, the selected file(s) will be passed as a list of paths, one per line to the stdin
stream of the bash code we enter in the text area.
Add the following code:
destination="$HOME/Documents/"
while read -r file; do
/usr/local/bin/quickpkg --output "$destination" "$file"
done
Your action should look like this:
First, we set a bash variable for the destination folder. You can change this to another path if you want to, but the destination folder has to exist before the workflow runs, otherwise you’ll get an error.
Then we use a while
loop with the read
command to read the stdin
input line by line. Then we run the quickpkg
tool once for each line.
You can now save the Workflow (it will be saved in ~/Library/Services/
) and then ‘QuickPkg’ (or whatever name you chose) will appear in Finder, for any selected item. Unfortunately, the Automator input controls don’t allow to filter for file types other than the few given ones.
Select a dmg with an application in it, such as the dmg downloaded from the Firefox website and wait a moment. Then check the ~/Documents
folder for the result.
(A rotating gear wheel will appear in the menu bar while the action is running. This is all the feedback you can get.)
Revealing the Result
It is annoying that we have to manually open the destination folder to see our result. But the nice thing is that we can let the workflow take care of that. In the action list on the left, search for ‘Reveal Finder Items’ or locate this action in the ‘Files & Folders’ category. You can drag it to the end of your workflow, below the ‘Run Shell Script’ action or just double-click in the list to add to the end of your workflow.
Save and run again from the Finder. It should now reveal the pkg file automatically.
You can add more actions to the workflow. For example, you can add actions to
- open with Pacifist or Suspicious Package
- tag the pkg file
- add a comment
- append the date to the file name
- copy the pkg to a file share
Improving the Workflow
You may have noticed during testing that in its current form the workflow doesn’t really react well when something goes wrong.
quickpkg
can work with .app
, .dmg
, and .zip
files. Unfortunatly, Automator does not let us filter for just those file types in the input setup. The script will report an error when you try to run it against a different file type, but the error is not displayed in Finder.
It is not that difficult to extend our short script to make it a bit more resilient. Change the code in the ‘Run Shell Script’ action to this:
destination="$HOME/Documents/"
while read -r file; do
result=$(/usr/local/bin/quickpkg --output "$destination" "$file")
if [[ $? != 0 ]]; then
osascript -e "display alert \"QuickPkg: An error occured: $result\""
else
echo "$result"
fi
done
With this code we check result code $?
of the quickpkg
command for an error. If the code is non-zero we display an alert with osascript
. If all went well, we echo
the result (the path to the new pkg) to stdout
, so that Automator can pass that into the following actions.
This is still a fairly crude error handling, but much better than nothing.
Summary
It is quite easy to turn simple shell commands into Automator workflows and Finder Quick Actions. Keep this in mind, when you find yourself performing repetetive tasks in Finder or in Terminal.
I tired to do this but I’m getting a error.
The action “Run Shell Script” encountered an error: “-: line 3: /users/local/bin/quickpkg: No such file or directory”
As the post says, you need to download and install the quickpkg tool first: https://github.com/scriptingosx/quickpkg