通过OS X命令行显示/隐藏文件扩展名


21

我正在寻找一种通过终端的方式来更改是否在Finder中显示特定文件的扩展名,具体方法如下:

$ hideextension ~/music/somesong.mp3

无需打开获取信息并更改复选框,因为它非常繁琐。

我计划将其合并到我使用FastScripts通过快捷方式调用的脚本中。我想尝试避免使用GUI脚本,因为这感觉很不干净,尽管任何有关如何实现此目的的想法都值得欢迎。


如果有什么不同,我正在尝试在Lion上实现。
joshua.thomas.bird

Answers:


24

通过GUI更改此设置的唯一真实方法是在“ Finder 信息”窗口中单击“ 隐藏扩展名 ” 。选中此选项将更改扩展属性,您通常无法编辑该扩展属性,至少不容易。但是,我们可以使用工具为我们做到这一点。com.apple.FinderInfo

为了使以下功能正常工作,您显然需要在Finder的首选项中取消选中“ 显示所有文件扩展名”


通过AppleScript

AppleScript通过set extension hidden命令提供此功能 。您显然需要alias一个文件对象。例如,我们可以通过对话框获得该信息。这只是一个最小的工作示例。

tell application "Finder"
    set some_file to (choose file)
    set extension hidden of some_file to true
end tell

要反转,只需truefalse此处交换即可。完整的通话例如是:

set extension hidden of alias "Macintosh HD:Users:werner:Desktop:file.png" to true

您也可以直接从脚本文件运行此命令(感谢@DanielBeck的帮助):

on run argv
tell application "Finder" to set extension hidden of (POSIX file (first item of argv) as alias) to true
end run

将其另存为filename.scpt,并使用以下命令从命令行运行:

osascript filename.scpt targetfile

SetFile命令

注意:自Xcode 6起不推荐使用。

如果安装了Xcode,则将获得SetFile(1)二进制文件,该二进制文件将完全满足您的要求(并提供一些与文件属性相关的功能):

隐藏扩展名:

SetFile -a E <file>

再次显示扩展名:

SetFile -a e <file>

严格来说,它是一个别名,而不是文件。以下是从命令行使用AppleScript的方法: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,用作osascript filename.scpt targetfile
丹尼尔·贝克

1
你说的没错,当然。我添加了完整的AppleScript事件。将来,只要继续并为答案添加任何重要内容,我们就随时欢迎您。
slhck 2012年

1
正是我一直在寻找..幸运的是,我已经安装了Xcode,SetFile达到了目的:-)
thandasoru

SetFileXcode 6开始不推荐使用。此外,指向手册页的链接也已过期。
富兰克林于

@FranklinYu感谢您的信息。您知道替代品吗?
slhck

4

感谢slhck 的回答,它帮了我很多忙,完成了我想做的事情。

因此,由于我喜欢快捷方式,因此我通过Automator创建了“运行Shell脚本”服务。

for f in "$@"
do
    STATUS=`getFileInfo -ae "$f"`
    if [ $STATUS== 0 ];
    then
        SetFile -a E "$f"
    else
        SetFile -a e "$f"
    fi
done

然后,我进入Finder->服务偏好设置,并为服务添加了快捷方式。

 "Command + Shift + H" didn't work for me,
 "Command + H" hides the application
 so i chose "Command + Shift + E"

希望能帮助到你。=)


STATUS=条线在最后缺少回音。另外,在我的Mac + XCode上,该命令GetFileInfo的首
字母为G。– bjnord

1

如果要显示当前隐藏的文件扩展名,还有另一个选项:Finder将此“隐藏扩展名”选项存储在com.apple.FinderInfo扩展文件属性中。您可以通过运行以下列出所有扩展属性的命令自己检查它:

xattr -l /path/to/the/file

因此,为了显示扩展名,您可以删除该属性:

xattr -d com.apple.FinderInfo /path/to/the/file

但是请记住,Finder 在此属性中存储了其他元数据,例如标签颜色,因此该元数据将丢失。并且,由于该属性是二进制的,因此您无法轻松地对其进行修改。


0

为了在命令行($ hideextension ~/music/somesong.mp3)上仅包含一个参数,可以使applescript成为shell脚本。#!/usr/bin/osascript像下面的代码一样,可以在shebang()中使用osascript 。继续 :

  1. 在.scpt文件中测试您的applescript代码=> toggle_hidden_​​extension.scpt
  2. 单击确定后,#!/usr/bin/osascript在文件开头添加shebang()
  3. 以文件格式“文本”导出它=> toggle_hidden_​​extension.applescript
  4. 将扩展名更改为.sh => toggle_hidden_​​extension.sh
  5. 在终端中,使其可执行:

    chmod u+x toggle_hidden_extension.sh
    
  6. 现在您可以运行它:

    ./toggle_hidden_extension.sh /path/to/myfile.mp3
    

所以,代码来说明:

#!/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

0

即使SetFile自Xcode 6起已弃用,它仍在XCode 11中可用,因此您可以预期它会在可预见的将来保留在命令行工具中...

https://download.developer.apple.com/Developer_Tools/Command_Line_Tools_for_Xcode_11/Command_Line_Tools_for_Xcode_11.dmg

$ pkgutil --payload-files /Volumes/Command\ Line\ Developer\ Tools/Command\ Line\ Tools.pkg | grep SetFile
./Library/Developer/CommandLineTools/usr/bin/SetFile
./Library/Developer/CommandLineTools/usr/share/man/man1/SetFile.1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.