MacOS, Finder, Applescript, Automator, Archive – Compressing Multiple Folders into Individual Zip Files

applescriptarchiveautomatorfindermacos

I have dozens of folders that I need to compress into individual zip files.

If I select all of these folders in the Finder and do "Compress [X] Items," I get one zip file containing all of the folders, whereas what I want is one zip file per folder.

I tried creating a workflow with Automator using the "Create Archive" action, but it behaves the same way: inputting multiple files/folders outputs a single zip file. There's no way to specify that the action run on each item individually.

Basically, I'm looking for a way to avoid having to tediously run "Compress" in the Finder on every single folder one at a time. Is there any way to automate this?

Best Answer

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

  1. Open Automator and select Service1 or File > New > Service If Automator is already open.

  2. Set Service receives selected to folders and in to Finder.

  3. 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
    
  4. 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

Compress Folders Separately - Automator Service