Curso AppleScript: OS X: sustituir el Finder con la shell, por Julifos

Hablo ahora de las capacidades applescrípticas del Finder bajo OS X 10.2.6 y anteriores.

Desafortunadamente, el Finder de OS X todavía no funciona muy bien con AppleScript (y, en mi opinión, en su uso normal tampoco es muy-allá). Algunas funciones del antiguo Finder ni siquiera han sido implementadas, como los comandos referentes a iconos o al desktop.

Por si eso fuera poco, las operaciones con el Finder son bastante lentas. Ignoro las razones, pero desde que empecé a trabajar con OS X, decidí que lo mejor era dejarlo a un lado y acogernos a los nuevos tiempos, a la shell de UNIX.

Las nuevas «Adiciones estándar» incluyen un comando genial: do shell script. Gracias a él podemos comunicarnos con la shell y movernos por nuestro equipo como se hace en un sistema *nix o, salvando las diferencias muy mucho, el viejo MS-DOS copiado por Microsoft a unas personas muy listas.

Aparentemente, da mucho miedo meterse en ese lenguaje críptico, que utiliza cosas como «ls» o «grep». De hecho, yo soy bastante acojonado para esas cosas. Pero las ventajas de aprender tres o cuatro cosillas para realizar operaciones básicas, es gigante en relación con el esfuerzo que cuesta aprenderlas.

Ahora vamos a ver algunas funciones que sustituyen a las viejas del Finder y a algunas de las adiciones estándar.

Antes de comenzar, le hago saber a vd. que puede aprender más de todos estos comandos yendo a la Terminal (en la carpeta Utilidades, dentro de Aplicaciones) y tecleando «man » + comando.

POSIX path

Antes de seguir adelante, vamos a explicar brevemente que «POSIX path» es el equivalente de «alias» en UNIX. Por ejemplo:

alias «disco:carpeta:documento.txt»

Es en POSIX path:

«/carpeta/documento.txt»

Hay un carácter especial, «~», hace referencia a la «home» del actual usuario.

Otra cosa a tener en cuenta, es que si vd. ve que su carpeta «Escritorio» se puede llamar aquí «desktop» es porque es una localización en castellano. Pero vd. puede acceder a su «desktop» o «library», aunque se llamen «Escritorio» y «Librería».

Además, no hay distinción teóricamente entre mayúsculas y minúsculas. Tampoco es obligatorio marcar si una cosa es o no una carpeta (como en el alias). «~/desktop» es lo mismo que «~/Desktop/».

Por último, hacer notar que los nombres de cosas dan problemas si, por ejemplo, contienen espacios o caracteres especiales. Por ello, es bueno poner siempre las rutas entre comillas o apóstrofes. Por ejemplo:

do shell script «ls ‘/car peta/cáspita.txt'»

En AppleScript, las adiciones estándar nos dan varias herramientas para manejar estos dichosos «path». Vamos directamente a los ejemplos:

set posixpath to POSIX path of alias «disco:carpeta:documento»

–> «/carpeta/documento»

set posixpath to POSIX path of «disco:carpeta:documento»

–> «/carpeta/documento»

set aliasOtraVez to «carpeta/documento» as POSIX file

–> file «disco:carpeta:documento»

No hay muchas más posibilidades. También tenemos otra herramienta. Como hemos dicho, los caracteres especiales (acentos, etc.) y los espacios en blanco nos dan problemas. Por eso, debemos siempre entrecomillar estos path y, en general, cualquier «string» que nos pueda dar problemas. Para ayudarnos, tenemos esto:

quoted form of «cualquier cosa extrañññña con acéééntos»

–> «‘cualquier cosa extrañññña con acéééntos'»

ls y find

Son unos de los comandos de la shell más útiles y frecuentemente utilizados. Es una especie de «list folder», pero con más funcionalidades. Para verlas, vaya vd. al Terminal y teclee «man ls» y «man find».

El primero hace listados, opcionalmente incluyendo datos extra, como tamaño en bytes, etc. Un ejemplo prástico:

do shell script «ls ~/desktop»

Devolverá un listado de kosas que hay en el escritorio del usuario actual, en forma de POSIX path.

Y éste:

do shell script «ls -Rs ~/desktop»

En un alarde de originalidad, devolverá un listado de hay en el escritorio del usuario actual, así como de *cosas contenidas dentro de sus carpetas, hasta el infinito*. Es un listado «recursivo» de items, gracias al «-R» que hemos incluido. Además, veremos el tamaño de las cosas (en grupos de 512 bytes, no todo iba a ser perfecto).

find es mucho más potente (ver «man find»), y las posibilidades son inmensas. Como su nombre indica, lo que hace es «encontrar» cosas. Por ejemplo:

do shell script «find ~/desktop -name ‘*.scpt’ -print»

Encontrará cualquier cosa que esté en el escritorio del actual usuario (y dentro de sus carpetas y subcarpetas) cuyo nombre termine en «.scpt». En fin, un mundo de posibilidades.

Por ver la comparativa, este ejemplo equivaldría a esto usando el Finder:

tell application «Finder»

   (every file of (entire contents of desktop) whose name ends with «.scpt») as alias list

end tell

La «única» diferencia apreciable es que el Finder puede tardar tres cuartos de hora, comparativamente con el comando de la shell, sobre todo si, como yo, tienen vdes. *miles* de documentos en el desktop.

ps

Equivale, más o menos, a preguntarle al Finder por los «processes». Básicamente, imprime un listado de las aplicaciones que están corriendo en estos momentos, junto con más información que le pidamos, como su PID (process id number), memoria que come, ciclos del procesador, etc. Puede ser muy útil en combinación con otros comandos. Este ejemplo, sin ir más lejos, hacer un force-quit del Internet Explorer:

set PID to word 1 of (do shell script «ps -x | grep ‘Internet Explorer'»)

do shell script «kill -1 » & PID

Force-quitar el IE siempre es un placer.

cp

Sirve para «copiar» o «duplicar» cosas. Vamos al ejemplo, que es muy sencillo:

do shell script «cp ~/documents/kosa.txt ~/desktop/naniero.txt»

Duplica el documento «kosa.txt» de la carpeta «documentos» al desktop, poniéndole, de paso, un nombre distinto: «naniero.txt». Para más opciones (como copiar directorios), consultar «man find».

AVISO: en la shell, la mayoría de comandos que tienen que ver con documentos sólo funcionan con el «data fork», e ignorarán y destruirán el «resource fork» existente. Para preservarlo, por ejemplo, en una función anexa a «cp», podemos utilizar «ditto» (consultar «man ditto»).

mv

Si es que vamos entendiendo la «jerga UNIX», mv significa ni más ni menos que «mover». Vamos al ejemplo:

do shell script «mv ~/documents/kosa.txt ~/desktop/naniero.txt»

do shell script «mv ~/desktop/naniero.txt ~/desktop/nanieromundi.txt»

El primer comando «mueve» el documento «kosa.txt» (en la carpeta «documentos» de la «home») al escritorio, y de paso le cambia de nombre. El segundo, lo único que hace es renombrar el archivo, ya que se encuentra en ambos casos en la misma carpeta. Para millones más de posibilidades, consultar «man mv».

cat

Éste sirve para doscientas cosas distintas. Por ejemplo:

do shell script «cat ~/desktop/naniero.txt»

Devuelve los contenidos del documento «naniero.txt» (equivalente al comando «read» de las adiciones estándar). Veamos algo más surrealista:

do shell script «cat ‘~/desktop/naniero’* > ‘~/desktop/ope.txt'»

Éste coge cualquier cosa cuyo nombre empiece por «naniero» y lo mete todo en un nuevo documento llamado «ope.txt» (todo tiene que encontrarse en el escritorio, claro).

En resumen, millones de posibilidades.

terminando

Estos son algunos de los comandos que más utilizo de la shell. Como ven vdes., no son muchos ni muy complicados, pero son muy útiles, potentes y rapidísimos. Si ha lugar, veremos algunos más en otro capitulillo.

Los restantes artículos sobe AppleScript se pueden encontrar en la categoría de Tutorial

4 Comments

  1. Anónimo

    con la opción -k, la lista sale en Kbytes, en lugar de unidades de 512 bytes; y con la opción -h, la lista sale en Kbytes, Mbytes, Gbytes, Tbytes o Pbytes, según el tamaño de los archivos; la primera es más útil para obtener Kbytes y poder comparar tamaños

    Otro comando muy interesante es cut (ver «man cut») para recortar la salida de cualquier comando, como ls, por ejemplo.

  2. Anónimo

    QUE TAL GENTE:

    NECESITO AYUDA. TENGO QUE IMPLEMENTAR EL COMPORTAMIENTO DEL COMANDO MV CON AYUDA DE LOS COMANDO LN Y RM.
    CASI LO TENGO ENCAMINADO, PERO EL CÓDIGO ME DA PROBLEMAS. SI ME PUDIESEIS ECHAR UNA MANO CON EL CÓDIGO, ES QUE LO NECESITO CON MUCHA URGENCIA, ES EL PRIMER PASO PARA PODER APROBAR LA ASIGNATURA QUE LLEVO EN 5 DE 6 CONVOCATORIAS.
    EL CÓDIGO ES EN LINUX, INTENTANDOLO ESTOY CON UNA PIPE, CON LN CREO EL ENLACE AL NUEVO DOCUMENTO Y CON RM BORRO EL ANTERIOR Y YA TENGO EL CAMBIO, PERO ME FALTA TESTEAR SI EXISTEN Y CREO QUE TB LA OPCION DE A UN FICHERO DE DIRECTORIO DIFERENTE CREO QUE SE ME COMPLICA.
    ECHARME UNA MANO POR FAVOR, GRACIAS DE ANTEMANO, SALU2

  3. Anónimo

    No sé como lo has hecho, pero una cosa «tonta», podría ser:
    ln -b original copia && rm original

    Siendo original el archivo original y copia, la copia que se crea del original.
    el -b es para «backup» (copia de seguridad) y el rm simplemente elimina el original.

    Espero que sea eso, a ver.

    Un saludo.

Deja una respuesta