Hide Logic Project File Extensions

Apple Logic Pro project bundles normally end in .logicx. If this extension is visible in Finder, it clutters the file name and looks odd when you are doing a quick Save As… during a session. The tiny helper below walks your project drives and toggles the hidden extension flag so that Logic’s bundle appears extension-less in Finder.

TL;DR – Drop the script somewhere on your drive, make it executable, then schedule it in LaunchControl to run every few minutes. Your projects will stay tidy automatically.


Why?

Logic’s default behaviour is to hide the extension for new projects, but there are plenty of ways for it to re-appear (cloning projects, copying between volumes, third-party utilities, expanding .zip archives etc.). Manually hiding the extension file-by-file quickly becomes a drag.

What the script does

  1. Walks one or more directories (your project drives) up to eight folders deep.
  2. Finds anything that matches *logicx (Logic project bundles).
  3. Skips files that are locked (immutable flag set).
  4. Runs the SetFile -a E command to mark the bundle’s extension as invisible.

That’s it.


Prerequisites

  • macOS (tested on Ventura & Sonoma)
  • Xcode Command Line Tools (provides the SetFile utility)
  • LaunchControl – the easiest way to schedule background jobs on macOS. (Technically optional, but strongly recommended.)

Installation / Setup

  1. Install LaunchControl if you don’t have it yet.
  2. Save the script below as hide_logic_extension.sh somewhere convenient (e.g. ~/Scripts). Adjust the DIRECTORIES array so it points at all your Logic project volumes.
  3. Make it executable:
   chmod +x hide_logic_extension.sh
  1. Create a new Launch Agent in LaunchControl that calls the script every few minutes. (In LaunchControl ? New ? User Agent, point Program to the script and set a simple start interval, e.g. 300 s.)

If you prefer the command line, you can craft your own plist and load it via launchctl, but I’ve found the GUI to be far less brittle.

Script contents

#!/bin/zsh

# Path to SetFile – part of the Xcode CLT package
SETFILE="/usr/bin/SetFile"

# Directories to search – EDIT THIS
DIRECTORIES=(
    "/Volumes/DRIVE-1"
    "/Volumes/DRIVE-2"
)

for DIRECTORY in "${DIRECTORIES[@]}"; do
    echo "Processing directory: $DIRECTORY"

    # Find files matching *logicx (Logic project bundles)
    find "$DIRECTORY" \
        -not -path "*.Trashes" \
        -not -path "*.DocumentRevisions-V100" \
        -not -path "*.TemporaryItems" \
        -maxdepth 8 \
        -name "*logicx" | while read -r file; do

        # Skip locked files/bundles
        if ls -lO "$file" | grep -q 'uchg'; then
            echo "Skipping locked file: $file"
        else
            "$SETFILE" -a E "$file" && \
            echo "Modified: $file" || \
            echo "Failed to modify: $file"
        fi
    done

done

LaunchControl settings

Below is a screenshot of a minimal configuration that runs the job every five minutes. (Replace with your own once you have the script in place.)


What if I don’t want LaunchControl?

You can absolutely roll your own plist:

<!-- ~/Library/LaunchAgents/com.example.hide-logic-extension.plist -->
<plist version="1.0">
  <dict>
    <key>Label</key> <string>com.example.hide-logic-extension</string>
    <key>ProgramArguments</key>
    <array>
      <string>/path/to/hide_logic_extension.sh</string>
    </array>
    <key>StartInterval</key> <integer>300</integer>
    <key>StandardOutPath</key> <string>/tmp/hide_logic_extension.log</string>
    <key>StandardErrorPath</key> <string>/tmp/hide_logic_extension.err</string>
  </dict>
</plist>

Load it with:

launchctl load -w ~/Library/LaunchAgents/com.example.hide-logic-extension.plist

…but I still recommend LaunchControl for the peace of mind.


Wrap-up

Enjoy cleaner project names! If this saved you a few clicks, you can buy me a coffee ?? and keep the caffeine flowing.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.