Apple - Creating an automated HFS+ compressed folder

There are two parts to the answer to your question.

  1. How to add a Finder context menu item to “Archive” files: this is easy to achieve by creating an Automator Service (Mac OS X Automation has a good overview of what the Automator services introduced in OS X 10.6 can do):

    • Launch Automator, choose “Service” when prompted for the kind of workflow you want to create.
    • Choose “Files or Folders” in the “Service receives” drop down (approximate translations – I’m on a German system). Optionally, set “in” drop down to “Finder”.
    • Add a “Get Selected Finder Items” action.
    • Add a “Move Finder Items” actions below that and set it to your target folder.
    • Save your service in the default location (~/Library/Services) as “Archive”.

    you now have a new service menu and context menu entry (depending on the number of services active: either on the first menu level, or in the “Services” submenu) called “Archive” that will move the selected file or folder to your target folder.

  2. How to automate HFS+ compression of files added to your target folder: there are several ways to achieve that. You could, of course, simply add that step to your archiving service. The disadvantage of this approach is that no compression will be applied if files or folders are ever added to the folder outside the service, of course. A better approach would be to have everything in the folder be compressed automatically, without reliance on the the entry vector or user interaction.

    One way is, as you have discovered, to have a compression utility run every time a file or folder is added to your watched folder:

    • the way to launch a shell utility in AppleScript is the do shell script command – see the linked documentation;
    • the inbuilt way to leverage filesystem events in an AppleScript is to use Folder Actions, which call AppleScripts on changes in a watched folder. What events the script reacts to are defined by the script itself, through the handlers it provides (for instance, the script in Mark’s answer has a handler for adding folder items – meaning it reacts to newly added files; see the Applescript Language Guide for the full reference). Folder Actions configuration is found in the services menu of folders in Finder (in the context menu, too).
    • a turbocharged alternative to Folder Actions is Paul Kim’s Hazel (commercial software), which adds rule based processing and a plethora of criteria for filesystem event handling that go far beyond what you can achieve with simple Folder Actions – you might want to investigate Hazel if you plan on doing more or more complex stuff along the lines of what you are planning now.

    An alternative to the whole scripting approach is using LateNiteSoft’s Clusters – another commercial software, that does nothing but automatically apply (and re-apply, where needed) HFS+ compression to the contents of watched folders.


@williamvoor: The script fails with filepaths which contain spaces, as set the file_name to the POSIX path of this_item does not escape properly. Correct the appropriate line of your code to this:

set cmd to "/Users/sn/bin/bin/afsctool -c \"" & file_name & "\""

Explanation: afcstool's file_name argument is surrounded with quotation marks, which themselves in the AppleScript code are escaped in order to be correctly handed over to the command line environment.

Meta-topic: As I lack reputation points, I could not comment at the appropriate position (= to @williamvoor 's own post), therefore I post it as an own answer, and ask you to edit the code change into your post, and give me a thumbs up, so that I gain enough reputation, enabling me to directly comment in the future. Thanks!

After that is done I or and admin could delete my post.


This thread gives an applescript to use as a Folder action which will compress files as they are added

on adding folder items to thisFolder after receiving theseItems
    set destinationPath to "/POSIX path/to/destination/folder"
    repeat with thisItem in theseItems
        set cmd to "ditto --hfsCompression " & quoted form of POSIX path of thisItem & " " & destinationPath
        do shell script cmd with administrator privileges
    end repeat
end adding folder items to