Revelando archivos en el Finder desde el Terminal utilizando AppleScript

Una de las mejores y más únicas características de macOS (nacido como Mac OS X, y transitoriamente como OS X) es su capacidad de combinar el interfaz clásico para navegación de archivos del Mac, el Finder, con el Terminal, y el soporte para ese lenguaje de pegamento y automatización que es AppleScript.

A veces uno realiza una búsqueda en terminal con comandos como find, grep, locate, o mdfind (el interfaz de terminal al motor de búsqueda Spotlight), pero quiere poder ver esos archivos en el Finder. Un podría usar la opción -R en el comando open, pero eso sirve sólo para un único archivo/carpeta (aunque la documentación dice que sirve para múltiples archivos). ¿Cómo hacerlo para múltiples archivos?

La clave está en AppleScript: el diccionario de comandos del Finder contiene un comando reveal_files al que se le puede pasar una lista de archivos. Como los archivos en terminal van separados por barras inclinadas (/), es necesario agregar as POSIX file al final de cada uno.

Con esa precaución, he creado una función reveal_files que lee sobre toda la lista de argumentos ($@), y para cada archivo ($file) genera la lista de AppleScript para después, con ella, llamar al comando osascript con el comando tell application "Finder" to reveal files {/path/file1 as POSIX file, /path/file2 as POSIX file, /path/file3 as POSIX file…}, que instruye al Finder a que muestre tantas carpetas como sea necesario, con los archivos que pertenezcan a cada una seleccionados.

El código completo del script podéis verlo a continuación (o en este link al Gist reveal_files.sh). ¡Espero que os sea útil!

reveal_files () {
num_files=0 # Number of already processed files
for file in $@ # Iterate over all entries after the `reveal_files` command.
do
# for each $file…
# does $file not start with "/"?
if [ ! "${file:0:1}" = "/" ]
then {
file="$(pwd)/$file"
# echo "Rebased file: $file"
} else { # Nothing to do if it does start with /
}
fi
# If this is not the first iteration ($num_files > 0)…
if [ $num_files -gt 0 ]
then {
# Check if the file starts with /
# … add the new file ($file) after the existing list ($file_list)
# separated by a comma (",")
file_list="$file_list, \"$file\" as POSIX file"
} else { # But if this is the first iteration ($num_files == 0)…
# … add the first file ($file) after the opening bracket ("{")
file_list="{ \"$file\" as POSIX file"
} # Note the usage of \" inside of quotes for literal quotes.
fi # continue with the next steps
# Increase the number of files processed
num_files=$(($num_files+1))
done
# Add the final closing bracket ("}")
file_list="$file_list }"
# Display number of processed files ($num_files) and the command ($file_list)
# echo "$num_files files: $file_list"
# Create the reveal command for `osascript`
reveal_command="tell application \"Finder\" to reveal $file_list"
# echo "Reveal AppleScript command:\\n$reveal_command"
# Run the reveal command; returns the AppleScript formatted list of files
osascript -e "$reveal_command"
}
view raw reveal_files.sh hosted with ❤ by GitHub

Actualización 2025-12-18: El script no sirve si no le pasas archivos que estén con toda la ruta completa. Por ejemplo, reveal_files MiArchivo1.pdf MiArchivo2.pdf no funcionaba con la versión anterior, así como tampoco reveal_files *.pdf. Con la actualización de hoy (añadido una comprobación de si el archivo comienza con el carácter “/”), se añade el camino al path actual en el momento de llamar la utilidad.

Otra forma de utilizarlo es utilizar la utilidad find de forma intermedia:

reveal_files $(find $(pwd) -iname "*.pdf")

Al pasar $(pwd) como primer argumento a find todos los path van a empezar for “/”, y la búsqueda con -iname es insensible a mayúsculas/minúsculas. Esta fórmula sí era compatible con la versión anterior del script, pero también se puede utilizar con la actualizada.

Descubre más desde Memoria de Acceso Aleatorio

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Seguir leyendo