Mostrar / ocultar la extensión de un archivo a través de la línea de comandos de OS X

21

Estoy buscando una manera, a través de la terminal, para cambiar si la extensión de un archivo específico se muestra o no en el Finder, algo así como:

$ hideextension ~/music/somesong.mp3

Sin tener que abrir Obtener información y cambiar la casilla de verificación, ya que es enormemente tedioso.

Planeo incorporarlo en un script que estoy llamando a través de un atajo usando FastScripts. Me gustaría intentar alejarme de las secuencias de comandos de la GUI, ya que eso se siente impuro, aunque cualquier idea sobre cómo lograr esto es bienvenida.

joshua.thomas.bird
fuente
Si hace alguna diferencia, estoy tratando de lograr esto en Lion.
joshua.thomas.bird

Respuestas:

24

La única forma real de cambiar esto a través de la GUI es hacer clic en Ocultar extensión en la ventana de Información del Finder . Marcar esto cambia el com.apple.FinderInfoatributo extendido, que normalmente no puede editar, al menos no fácilmente. Sin embargo, podemos usar una herramienta para hacerlo por nosotros.

Para que funcione a continuación, obviamente debe tener Mostrar todas las extensiones de archivo sin marcar en las preferencias del Finder.


A través de AppleScript

AppleScript ofrece esta funcionalidad con el set extension hiddencomando. Obviamente necesita un aliasobjeto de archivo. Podemos obtener eso, por ejemplo, a través de un diálogo. Aquí hay un ejemplo de trabajo mínimo.

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

Para revertir, solo intercambie truecon falseaquí. La llamada completa es entonces, por ejemplo:

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

También puede ejecutar esto directamente desde un archivo de script (gracias @DanielBeck por la adición):

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

Guarde esto como filename.scpty ejecútelo desde la línea de comandos con:

osascript filename.scpt targetfile

Con el SetFilecomando

Nota: Esto está en desuso desde Xcode 6.

Si tiene instalado Xcode, obtendrá el SetFile(1)binario, que hace exactamente lo que desea (y ofrece algunas funciones más relacionadas con los atributos del archivo):

Ocultar extensión:

SetFile -a E <file>

Mostrar extensión nuevamente:

SetFile -a e <file>
slhck
fuente
Estrictamente hablando, es un alias, no un archivo. Aquí se explica cómo usar AppleScript desde la línea de comandos:, 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
1
Tienes razón, por supuesto. Agregué el evento completo de AppleScript. En el futuro, simplemente continúe y agregue algo importante a la respuesta, siempre será bienvenido.
slhck
1
justo lo que estaba buscando ... afortunadamente tengo Xcode instalado y SetFile hizo el truco :-)
thandasoru
SetFileestá en desuso desde Xcode 6 . También el enlace a la página del manual ha caducado.
Franklin Yu
@FranklinYu Gracias por la información. ¿Conoces un reemplazo?
slhck
4

Gracias slhck por tu respuesta, me ayudó mucho a conseguir lo que quería hacer.

Entonces, como me gustan los accesos directos, creé un servicio "Ejecutar script de Shell" a través de Automator.

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

Luego fui a Finder -> Preferencias de servicios y agregué un acceso directo al Servicio.

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

Espero eso ayude. =)

Flurin Arner
fuente
A la STATUS=línea le falta una marca de retroceso al final. Además, en mi Mac + XCode, el comando GetFileInfotiene una G mayúscula
Bjnord
1

Hay una opción más si desea mostrar la extensión de archivo que está oculta actualmente: Finder almacena esta opción de "ocultar extensión" en com.apple.FinderInfoel atributo de archivo extendido. Puede verificarlo usted mismo ejecutando este comando que enumera todos los atributos extendidos:

xattr -l /path/to/the/file

Entonces, para mostrar la extensión, puede eliminar ese atributo:

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

Pero tenga en cuenta que Finder almacena otros metadatos como el color de la etiqueta en este atributo, por lo que se perderán estos metadatos. Y, dado que el atributo es binario, no puede modificarlo fácilmente.

skozin
fuente
0

Para tener solo un argumento en la línea de comando ( $ hideextension ~/music/somesong.mp3), puede hacer que su applecript se convierta en un script de shell. Es posible usar osascript en shebang ( #!/usr/bin/osascript) como en el siguiente código. Para proceder :

  1. Pruebe su código de applecript en un archivo .scpt => toggle_hidden_extension.scpt
  2. Cuando esté bien, agregue el shebang ( #!/usr/bin/osascript) al comienzo del archivo
  3. Exportarlo con el formato de archivo "text" => toggle_hidden_extension.applescript
  4. Cambie la extensión a .sh => toggle_hidden_extension.sh
  5. En Terminal, hazlo ejecutable:

    chmod u+x toggle_hidden_extension.sh
    
  6. Ahora puedes ejecutarlo:

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

Entonces, el 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
fuente
0

Incluso si SetFileestá en desuso desde Xcode 6, todavía está disponible en XCode 11, por lo que puede esperar que permanezca en las Herramientas de línea de comandos en el futuro previsible ...

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
fuente