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
- Walks one or more directories (your project drives) up to eight folders deep.
- Finds anything that matches
*logicx
(Logic project bundles). - Skips files that are locked (immutable flag set).
- 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
- Install LaunchControl if you don’t have it yet.
- Save the script below as
hide_logic_extension.sh
somewhere convenient (e.g.~/Scripts
). Adjust theDIRECTORIES
array so it points at all your Logic project volumes. - Make it executable:
chmod +x hide_logic_extension.sh
- 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 vialaunchctl
, 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.