{"id":6567,"date":"2025-06-27T16:28:28","date_gmt":"2025-06-27T14:28:28","guid":{"rendered":"https:\/\/www.hanshafner.de\/blog\/?p=6567"},"modified":"2025-07-25T08:56:37","modified_gmt":"2025-07-25T06:56:37","slug":"hide-logic-project-file-extensions","status":"publish","type":"post","link":"https:\/\/www.hanshafner.de\/blog\/2025\/06\/27\/hide-logic-project-file-extensions\/","title":{"rendered":"Hide Logic Project File Extensions"},"content":{"rendered":"\n<p>Apple Logic Pro project bundles normally end in <code>.logicx<\/code>. If this extension is visible in Finder, it clutters the file name and looks odd when you are doing a quick <em>Save As\u2026<\/em> during a session. The tiny helper below walks your project drives and toggles the <em>hidden extension<\/em> flag so that Logic&#8217;s bundle appears extension-less in Finder.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>TL;DR \u2013 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.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Why?<\/h2>\n\n\n\n<p>Logic&#8217;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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What the script does<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Walks one or more directories (your project drives) up to eight folders deep.<\/li>\n\n\n\n<li>Finds anything that matches <code>*logicx<\/code> (Logic project bundles).<\/li>\n\n\n\n<li>Skips files that are <strong>locked<\/strong> (immutable flag set).<\/li>\n\n\n\n<li>Runs the <code>SetFile -a E<\/code> command to mark the bundle&#8217;s extension as <em>invisible<\/em>.<\/li>\n<\/ol>\n\n\n\n<p>That&#8217;s it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>macOS (tested on Ventura &amp; Sonoma)<\/li>\n\n\n\n<li>Xcode Command Line Tools (provides the <code>SetFile<\/code> utility)<\/li>\n\n\n\n<li><a href=\"https:\/\/www.soma-zone.com\/LaunchControl\/\">LaunchControl<\/a> \u2013 the easiest way to schedule background jobs on macOS. (Technically optional, but strongly recommended.)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Installation \/ Setup<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Install LaunchControl<\/strong> if you don&#8217;t have it yet.<\/li>\n\n\n\n<li><strong>Save the script<\/strong> below as <code>hide_logic_extension.sh<\/code> somewhere convenient (e.g. <code>~\/Scripts<\/code>). Adjust the <code>DIRECTORIES<\/code> array so it points at all your Logic project volumes.<\/li>\n\n\n\n<li><strong>Make it executable<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>   chmod +x hide_logic_extension.sh<\/code><\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>Create a new Launch Agent<\/strong> in LaunchControl that calls the script every few minutes. (In LaunchControl ? <em>New ? User Agent<\/em>, point <em>Program<\/em> to the script and set a simple start interval, e.g. <em>300 s<\/em>.)<\/li>\n<\/ol>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>If you prefer the command line, you can craft your own <code>plist<\/code> and load it via <code>launchctl<\/code>, but I&#8217;ve found the GUI to be far less brittle.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Script contents<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/zsh\n\n# Path to SetFile \u2013 part of the Xcode CLT package\nSETFILE=\"\/usr\/bin\/SetFile\"\n\n# Directories to search \u2013 EDIT THIS\nDIRECTORIES=(\n    \"\/Volumes\/DRIVE-1\"\n    \"\/Volumes\/DRIVE-2\"\n)\n\nfor DIRECTORY in \"${DIRECTORIES&#91;@]}\"; do\n    echo \"Processing directory: $DIRECTORY\"\n\n    # Find files matching *logicx (Logic project bundles)\n    find \"$DIRECTORY\" \\\n        -not -path \"*.Trashes\" \\\n        -not -path \"*.DocumentRevisions-V100\" \\\n        -not -path \"*.TemporaryItems\" \\\n        -maxdepth 8 \\\n        -name \"*logicx\" | while read -r file; do\n\n        # Skip locked files\/bundles\n        if ls -lO \"$file\" | grep -q 'uchg'; then\n            echo \"Skipping locked file: $file\"\n        else\n            \"$SETFILE\" -a E \"$file\" &amp;&amp; \\\n            echo \"Modified: $file\" || \\\n            echo \"Failed to modify: $file\"\n        fi\n    done\n\ndone<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">LaunchControl settings<\/h3>\n\n\n\n<p>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.)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.hanshafner.de\/blog\/wp-content\/uploads\/2025\/06\/Hide_Logic_Extension_LaunchControl_Settings.png\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"355\" src=\"https:\/\/www.hanshafner.de\/blog\/wp-content\/uploads\/2025\/06\/Hide_Logic_Extension_LaunchControl_Settings-700x355.png\" alt=\"\" class=\"wp-image-6570\" srcset=\"https:\/\/www.hanshafner.de\/blog\/wp-content\/uploads\/2025\/06\/Hide_Logic_Extension_LaunchControl_Settings-700x355.png 700w, https:\/\/www.hanshafner.de\/blog\/wp-content\/uploads\/2025\/06\/Hide_Logic_Extension_LaunchControl_Settings-465x236.png 465w, https:\/\/www.hanshafner.de\/blog\/wp-content\/uploads\/2025\/06\/Hide_Logic_Extension_LaunchControl_Settings-768x390.png 768w, https:\/\/www.hanshafner.de\/blog\/wp-content\/uploads\/2025\/06\/Hide_Logic_Extension_LaunchControl_Settings.png 946w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/a><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">What if I don&#8217;t want LaunchControl?<\/h2>\n\n\n\n<p>You can absolutely roll your own <code>plist<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- ~\/Library\/LaunchAgents\/com.example.hide-logic-extension.plist --&gt;\n&lt;plist version=\"1.0\"&gt;\n  &lt;dict&gt;\n    &lt;key&gt;Label&lt;\/key&gt; &lt;string&gt;com.example.hide-logic-extension&lt;\/string&gt;\n    &lt;key&gt;ProgramArguments&lt;\/key&gt;\n    &lt;array&gt;\n      &lt;string&gt;\/path\/to\/hide_logic_extension.sh&lt;\/string&gt;\n    &lt;\/array&gt;\n    &lt;key&gt;StartInterval&lt;\/key&gt; &lt;integer&gt;300&lt;\/integer&gt;\n    &lt;key&gt;StandardOutPath&lt;\/key&gt; &lt;string&gt;\/tmp\/hide_logic_extension.log&lt;\/string&gt;\n    &lt;key&gt;StandardErrorPath&lt;\/key&gt; &lt;string&gt;\/tmp\/hide_logic_extension.err&lt;\/string&gt;\n  &lt;\/dict&gt;\n&lt;\/plist&gt;<\/code><\/pre>\n\n\n\n<p>Load it with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>launchctl load -w ~\/Library\/LaunchAgents\/com.example.hide-logic-extension.plist<\/code><\/pre>\n\n\n\n<p>\u2026but I still recommend LaunchControl for the peace of mind.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Wrap-up<\/h2>\n\n\n\n<p>Enjoy cleaner project names! If this saved you a few clicks, you can <a href=\"https:\/\/buymeacoffee.com\/hanshafner\">buy me a coffee<\/a> ?? and keep the caffeine flowing.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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\u2026 during a session. The tiny helper below walks your project drives and toggles the hidden extension flag so that Logic&#8217;s bundle appears extension-less [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,233],"tags":[234],"class_list":["post-6567","post","type-post","status-publish","format-standard","hentry","category-blog-2","category-tools","tag-macos"],"_links":{"self":[{"href":"https:\/\/www.hanshafner.de\/blog\/wp-json\/wp\/v2\/posts\/6567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.hanshafner.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.hanshafner.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.hanshafner.de\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.hanshafner.de\/blog\/wp-json\/wp\/v2\/comments?post=6567"}],"version-history":[{"count":3,"href":"https:\/\/www.hanshafner.de\/blog\/wp-json\/wp\/v2\/posts\/6567\/revisions"}],"predecessor-version":[{"id":6572,"href":"https:\/\/www.hanshafner.de\/blog\/wp-json\/wp\/v2\/posts\/6567\/revisions\/6572"}],"wp:attachment":[{"href":"https:\/\/www.hanshafner.de\/blog\/wp-json\/wp\/v2\/media?parent=6567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.hanshafner.de\/blog\/wp-json\/wp\/v2\/categories?post=6567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.hanshafner.de\/blog\/wp-json\/wp\/v2\/tags?post=6567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}