Mostrar / ocultar a extensão de um arquivo pela linha de comando do OS X

21

Estou procurando uma maneira, via terminal, de alterar se a extensão de um arquivo específico é ou não mostrada no Finder, algo como:

$ hideextension ~/music/somesong.mp3

Sem precisar abrir a opção Obter informações e alterar a caixa de seleção, pois é extremamente tedioso.

Pretendo incorporá-lo em um script que estou chamando através de um atalho usando o FastScripts. Eu gostaria de tentar ficar longe dos scripts da GUI, pois isso parece sujo, embora sejam bem-vindas quaisquer idéias sobre como fazer isso.

joshua.thomas.bird
fonte
Se faz alguma diferença, estou tentando fazer isso no Lion.
joshua.thomas.bird

Respostas:

24

A única maneira real de mudar isso via GUI é clicar em Ocultar extensão na janela Informações do Finder . Marcar essa opção altera o com.apple.FinderInfoatributo estendido, que você normalmente não pode editar - pelo menos não facilmente. No entanto, podemos usar uma ferramenta para fazer isso por nós.

Para que o procedimento abaixo funcione, você obviamente precisa ter a opção Mostrar todas as extensões de arquivo desmarcada nas preferências do Finder.


Através do AppleScript

AppleScript oferece essa funcionalidade com o set extension hiddencomando Você obviamente precisa aliasde um objeto de arquivo. Podemos entender isso, por exemplo, através de um diálogo. Aqui está apenas um exemplo de trabalho mínimo.

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

Para reverter, basta trocar truecom falseaqui. A chamada completa é então, por exemplo:

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

Você também pode executar isso diretamente de um arquivo de script (obrigado @DanielBeck pela adição):

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

Salve isso como filename.scpte execute-o na linha de comando com:

osascript filename.scpt targetfile

Com o SetFilecomando

Nota: Isso está obsoleto desde o Xcode 6.

Se você tiver o Xcode instalado, receberá o SetFile(1)binário, que faz exatamente o que deseja (e oferece mais algumas funções relacionadas aos atributos do arquivo):

Ocultar extensão:

SetFile -a E <file>

Mostrar extensão novamente:

SetFile -a e <file>
slhck
fonte
A rigor, é um apelido, não um arquivo. Veja como usar o AppleScript na linha de comando:, on run argv [newline] tell application "Finder" to set extension hidden of (POSIX file (first item of argv) as alias) to true [newline] end runuse as osascript filename.scpt targetfile.
Daniel Beck
11
Você está certo, é claro. Eu adicionei o evento AppleScript completo. No futuro, basta ir em frente e adicionar algo importante à resposta - você é sempre bem-vindo.
slhck
11
apenas o que eu estava procurando .. felizmente tenho Xcode instalado e SetFile fez o truque :-)
thandasoru
SetFileestá obsoleto desde o Xcode 6 . Também o link para a página do manual expirou.
Franklin Yu
@FranklinYu Obrigado pela informação. Você conhece um substituto?
slhck
4

Obrigado slhck pela sua resposta, isso me ajudou muito a conseguir o que queria.

Portanto, como gosto de atalhos, criei um serviço "Executar script de shell" no Automator.

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

Depois fui ao Finder -> Services Preferences e adicionei um atalho ao Service.

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

Espero que ajude. =)

Flurin Arner
fonte
A STATUS=linha está faltando um back-tick no final. Além disso, no meu Mac + XCode, o comando GetFileInfotem um capital G.
bjnord
1

Há mais uma opção se você deseja mostrar a extensão do arquivo oculta no momento: O Finder armazena essa opção "ocultar extensão" no com.apple.FinderInfoatributo de arquivo estendido. Você pode verificar você mesmo executando este comando que lista todos os atributos estendidos:

xattr -l /path/to/the/file

Portanto, para mostrar a extensão, você pode remover esse atributo:

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

Mas lembre-se de que o Finder armazena outros metadados , como a cor da tag nesse atributo, para que esses metadados sejam perdidos. E, como o atributo é binário, você não pode modificá-lo facilmente.

skozin
fonte
0

Para ter apenas um argumento na linha de comando ( $ hideextension ~/music/somesong.mp3), você pode transformar seu AppleScriptScript em um shell script. É possível usar o osascript no shebang ( #!/usr/bin/osascript) como no código a seguir. Para prosseguir:

  1. Teste seu código AppleScript em um arquivo .scpt => toggle_hidden_extension.scpt
  2. Quando estiver OK, adicione o shebang ( #!/usr/bin/osascript) no início do arquivo
  3. Exporte-o com o formato de arquivo "text" => toggle_hidden_extension.applescript
  4. Altere a extensão para .sh => toggle_hidden_extension.sh
  5. No Terminal, torne-o executável:

    chmod u+x toggle_hidden_extension.sh
    
  6. Agora você pode executá-lo:

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

Então, o código para ilustrar:

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

Mesmo que SetFileseja descontinuado desde o Xcode 6, ele ainda está disponível no XCode 11, portanto, você pode esperar que ele permaneça nas Ferramentas de Linha de Comando no futuro previsível ...

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
fonte