Here is an Automator Service1 that becomes available in Finder when Folders are selected and emulates the context-menus Compress [n] Items command except it creates an individual zip archive file for each selected Folder in the name of the selected Folder. If the Folder Name.zip file already exists then a " 2"
(space 2) is appended to the filename, e.g. Folder Name 2.zip. This ensures an existing zip archive file is not touched and the zip archive filename will be automatically incremented as necessary.
1 In macOS Mojave, and later, an Automator Service is called a Quick Action. There are also other minor nomenclature differences but they should be more obvious when comparing them to pre-macOS Mojave Automator workflows.
To Create the Service:1
Open Automator and select Service1 or File > New > Service If Automator is already open.
Set Service receives selected to folders and in to Finder.
Add a Run Shell Script Action, setting Shell: to /bin/bash and Pass input: to as arguments and add the following code:
for f in "$@"; do
dn="$(dirname "$f")"
bn="$(basename "$f")"
cd "$dn" || exit
if [[ ! -e "$bn.zip" ]]; then
ditto -c -k --sequesterRsrc --keepParent "$f" "$bn.zip"
else
n=2
for i in $bn *.zip; do
if [[ "$bn $n.zip" == "$i" ]]; then
n="$(( n + 1 ))"
fi
done
ditto -c -k --sequesterRsrc --keepParent "$f" "$bn $n.zip"
fi
done
afplay /System/Library/Sounds/Purr.aiff
Save the Service as: Compress Folders Separately
To Use the Service:
In Finder or on the Desktop select multiple Folders, then right-click and select Compress Folders Separately from under Services.
Or after selecting the target Folders, you can also click Finder > Services > Compress Folders Separately from the menu bar.
There you have it, a way to compress multiple folder separately and simultaneously at one time in individual zip archives while emulating how Finder creates a zip archive file. Meaning the zip archive contains preserved resource forks and HFS meta-data in the subdirectory __MACOSX and embeds only the parent directory name source in destination-archive, not the fully qualified pathname as when using zip
(without -j
) to create the archive.
Image of Compress Folders Separately
popd
and corrected a fatal typo infor i in $bn*.zip; do
, which should have beenfor i in $bn *.zip; do
. Note the space between$bn
and*.zip
, it was missing and shouldn't have been. So please update it in your implementation otherwise it steps onFile Name 2.zip
when thebasename
has a space in it.