Показать / скрыть расширение файла через командную строку OS X

21

Я ищу способ через терминал, чтобы изменить, отображается ли расширение конкретного файла в Finder, что-то вроде:

$ hideextension ~/music/somesong.mp3

Без необходимости открывать Get Info и менять флажок, так как это очень утомительно.

Я планирую включить его в скрипт, который я вызываю с помощью ярлыка с использованием FastScripts. Я хотел бы попытаться держаться подальше от сценариев GUI, так как это кажется нечистым, хотя любые идеи о том, как этого добиться, приветствуются.

joshua.thomas.bird
источник
Если это имеет какое-то значение, я пытаюсь сделать это на Льве.
joshua.thomas.bird

Ответы:

24

Единственный реальный способ изменить это через графический интерфейс - это щелкнуть Скрыть расширение в окне Finder Info . Проверка этого изменяет 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

Чтобы изменить, просто обмениваться trueс falseздесь. Полный вызов тогда, например:

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>
slhck
источник
Строго говоря, это псевдоним, а не файл. Вот как использовать 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
1
только то, что я искал .. к счастью, у меня установлен Xcode и SetFile сделали свое дело :-)
thandasoru
SetFileустарела с Xcode 6 . Также истек срок действия ссылки на страницу руководства.
Франклин Ю
@FranklinYu Спасибо за информацию. Вы знаете о замене?
Slhck
4

Спасибо slhck за ваш ответ, он помог мне получить то, что я хотел сделать.

Так как мне нравятся ярлыки, я создал службу «Run Shell Script» через Automator.

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есть заглавная
буква
1

Существует еще одна опция, если вы хотите показать расширение файла, которое в данный момент скрыто: Finder сохраняет эту опцию «скрыть расширение» в com.apple.FinderInfoрасширенном атрибуте файла. Вы можете проверить это самостоятельно, выполнив эту команду, которая перечисляет все расширенные атрибуты:

xattr -l /path/to/the/file

Итак, чтобы показать расширение, вы можете удалить этот атрибут:

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

Но имейте в виду, что Finder хранит другие метаданные, такие как цвет тега, в этом атрибуте, поэтому эти метаданные будут потеряны. И, поскольку атрибут является двоичным, вы не можете легко изменить его.

skozin
источник
0

Для того чтобы в командной строке был только один аргумент ( $ hideextension ~/music/somesong.mp3), вы можете превратить ваш applecript в сценарий оболочки. Можно использовать osascript в shebang ( #!/usr/bin/osascript), как в следующем коде. Продолжать :

  1. Проверьте ваш яблочный код в файле .scpt => toggle_hidden_extension.scpt
  2. Когда все в порядке, добавьте shebang ( #!/usr/bin/osascript) в начале файла
  3. Экспортируйте его с форматом файла "text" => 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
boissonnfive
источник
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
dardo82
источник