Show/hide extension of a file through OS X command line
Solution 1
The only real way to change this via GUI is to click Hide extension in the Finder Info window. Checking this changes the com.apple.FinderInfo
extended attribute, which you normally can't edit – at least not easily. We can however use a tool to do it for us.
For the below to work, you obviously need to have Show all file extensions unchecked in Finder's preferences.
Through AppleScript
AppleScript offers this functionality with the set extension hidden
command. You obviously need an alias
to a file object. We can get that, for example, though a dialog. Here's just a minimal working example.
tell application "Finder"
set some_file to (choose file)
set extension hidden of some_file to true
end tell
To reverse, just exchange true
with false
here. The full call is then, for example:
set extension hidden of alias "Macintosh HD:Users:werner:Desktop:file.png" to true
You can run this straight from a script file too (thanks @DanielBeck for the addition):
on run argv
tell application "Finder" to set extension hidden of (POSIX file (first item of argv) as alias) to true
end run
Save this as filename.scpt
and run it from the command line with:
osascript filename.scpt targetfile
With the SetFile
command
Note: This is deprecated since Xcode 6.
If you have Xcode installed, you will get the SetFile(1)
binary, which does exactly what you want (and offers a few more functions related to file attributes):
Hide extension:
SetFile -a E <file>
Show extension again:
SetFile -a e <file>
Solution 2
Thanks slhck for your Answer, it helped me a bunch to get what I wanted done.
So since I like shortcuts, I created a "Run Shell Script" Service though Automator.
for f in "$@"
do
STATUS=`getFileInfo -ae "$f"`
if [ $STATUS== 0 ];
then
SetFile -a E "$f"
else
SetFile -a e "$f"
fi
done
Then I went to Finder -> Services Preferences and added a shortcut to the Service.
"Command + Shift + H" didn't work for me,
"Command + H" hides the application
so i chose "Command + Shift + E"
Hope it helps. =)
Solution 3
There is one more option if you want to show file extension that is currently hidden: Finder stores this "hide extension" option in com.apple.FinderInfo
extended file attribute. You can check it yourself by running this command which lists all extended attributes:
xattr -l /path/to/the/file
So, in order to show the extension, you can remove that attribute:
xattr -d com.apple.FinderInfo /path/to/the/file
But keep in mind that Finder stores other metadata such as tag color in this attribute, so this metadata will be lost. And, since the attribute is binary, you cannot easily modify it.
Solution 4
In order to have only one argument on the command line ($ hideextension ~/music/somesong.mp3
), you can make your applescript become a shell script.
It is possible to use osascript in the shebang (#!/usr/bin/osascript
) like in the following code.
To proceed :
- Test your applescript code in a .scpt file => toggle_hidden_extension.scpt
- When OK, add the shebang (
#!/usr/bin/osascript
) at the beginning of the file - Export it with file format "text" => toggle_hidden_extension.applescript
- Change extension to .sh => toggle_hidden_extension.sh
In Terminal, make it executable :
chmod u+x toggle_hidden_extension.sh
Now you can run it :
./toggle_hidden_extension.sh /path/to/myfile.mp3
So, the code to illustrate:
#!/usr/bin/osascript
(*
usage: toggle_hidden_extension.sh file
*)
(*
Test 1 : ./toggle_hidden_extension.sh /Users/boissonnfive/Desktop/file.txt
Test 2 : ./toggle_hidden_extension.sh
Test 3 : ./toggle_hidden_extension.sh 0fdjksl/,3
*)
on run argv
try
processArgs(argv)
toggleHiddenExtension(item 1 of argv)
on error
return usage()
end try
if result then
return "Extension hidden for " & POSIX path of (item 1 of argv)
else
return "Extension revealed for " & (POSIX path of (item 1 of argv))
end if
end run
on usage()
return "usage: toggle_hidden_extension.sh file"
end usage
on processArgs(myArgs)
set item 1 of myArgs to POSIX file (first item of myArgs) as alias
end processArgs
on toggleHiddenExtension(myFile)
tell application "Finder" to set extension hidden of myFile to not (extension hidden of myFile)
end toggleHiddenExtension
joshua.thomas.bird
Updated on September 18, 2022Comments
-
joshua.thomas.bird over 1 year
I'm looking for a way, via terminal, to change whether or not a specific file's extension is shown in the Finder, something along the lines of:
$ hideextension ~/music/somesong.mp3
Without having to open Get Info and change the checkbox, as it's massively tedious.
I plan on incorporating it into a script I'm calling via a shortcut using FastScripts. I'd like to try and stay away from GUI scripting as that feels unclean, although any ideas on how to accomplish this are welcome.
-
HikeMike about 12 yearsStrictly speaking, it's an alias, not a file. Here's how to use the AppleScript from the command line:
on run argv [newline] tell application "Finder" to set extension hidden of (POSIX file (first item of argv) as alias) to true [newline] end run
, use asosascript filename.scpt targetfile
. -
slhck about 12 yearsYou're right, of course. I added the full AppleScript event. In the future, just go ahead and add anything important to the answer – you're always welcome to.
-
thandasoru over 10 yearsjust what I was looking for.. thankfully I have Xcode installed and SetFile did the trick :-)
-
bjnord about 9 yearsThe
STATUS=
line is missing a back-tick at the end. Also, on my Mac + XCode, the commandGetFileInfo
has a capital G. -
Franklin Yu over 5 years
SetFile
is deprecated since Xcode 6. Also the link to manual page has expired. -
slhck over 5 years@FranklinYu Thanks for the info. Do you know of a replacement?
-
Franklin Yu over 5 years@slhck Not that I know of. I would use the AppleScript solution as you mentioned in answer. (And wish that Apple would not deprecate that as well.)
-
Mark Glossop about 3 yearsSetFile is deprecated as noted, but it's still present on Catalina. Using it worked well enough for me today.