sábado, 11 de octubre de 2014

Cómo copiar a la vez varios archivos ubicados en distintas carpetas utilizando sus alias o sus symlinks.


Suelo tener mis documentos y demás archivos guardados y ordenados en sus correspondientes carpetas y subcarpetas. Pero necesito tener muchos de ellos “a mano”, reunidos en una carpeta visible en el Dock, en la barra lateral de las ventanas del Finder o bien en el Escritorio. Es decir, quiero tenerlos archivados en su carpeta, pero que al mismo tiempo sean accesibles. Para evitar duplicarlos y hacerme un lío con diferentes versiones hago lo mismo que vosotros: crear alias.

(Otro escenario sería el caso del usuario que gestiona sus fotos en carpetas del Finder, y que utiliza alias de las imágenes para crear selecciones a modo de álbumes.)

El asunto es, que a menudo necesito llevarlos conmigo en un pendrive y como es evidente, no puedo copiar los alias ya que necesito los originales. Si se trata solo de un par de archivos la solución es fácil: seleccionar los alias y teclear cmd+R (o hacer clic derecho e ir a Mostrar original). Se abrirán tantas ventanas del Finder como ubicaciones tengan los documentos originales y estos aparecerán realzados en azul en sus correspondientes ventanas de carpeta. Sólo quedará copiar uno a uno al pendrive. 

Vale, pero ¿y si son decenas de archivos repartidos en decenas de carpetas? Lo que tendríamos son decenas de ventanas abiertas. Necesitaba una solución que me permitiera seleccionar todos los ítems de la carpeta de alias y copiar los correspondientes originales de forma sencilla y rápida. Automator no tiene por defecto ninguna acción que sirva de ayuda, aunque si existen conjuntos de acciones “de pago” que incluyen algo como el “Get originales from alias” de Automated Workflows. El precio no es excesivo pero decidí buscar un Applescript que hiciera algo parecido.

Finalmente encontré en nnForums este script que propone Diggory Laycock:

[php]
set the backupSource to ":Users:diggory:aliases" as alias
set the backupDestination to ":users:diggory:Backup:" as alias

tell application "Finder"
set everyAlias to every item of folder backupSource

repeat with thisAlias in everyAlias
set originalFile to (original item of thisAlias)
duplicate originalFile to backupDestination
end repeat
end tell
[/php]


Confieso que soy un analfabeto en Applescript, pero he aprendido a "toquetear" los scripts con cortar, pegar y algo de imaginación. De hecho, hago como algunos ingenieros genéticos, que no saben cómo funciona el genoma de la mosca del vinagre, pero si que si quitan o modifican cierto gen les va a salir una mosquita con las alas rizadas o sin ellas.

Por un lado tenía claro es que no era práctico editar el script cambiando cada vez las carpetas de origen (backupSource) y de destino (backupDestination)  y que me iba a resultar más cómodo incorporar el script en Automator y que fuera éste el que le pasara los datos. Para mi, la solución era crear un workflow de Automator a modo de Servicio, que me me permitiera “hacer clic derecho” sobre la carpeta donde se encontraban los alias y apareciese un cuadro de diálogo que me solicitara una carpeta en la que hacer la copia de los originales.
Después de recordar cómo se hacía en Automator para pasar las variables al script, y modificar éste para ello, tras varios intentos obtuve este resultado:
(Haz clic sobre las imágenes para ampliarlas)


El script lo he adaptado de este modo:

on run {input, parameters}
set backupSource to first item of input
set backupDestination to second item of input
tell application "Finder"
set everyAlias to every item of folder backupSource
repeat with thisAlias in everyAlias
set originalFile to (original item of thisAlias)
duplicate originalFile to backupDestination
end repeat
end tell
end run


En mi caso funciona perfectamente, aunque le quedan detalles por pulir. Si la carpeta contiene un archivo que no sea un alias, o en la carpeta de destino ya existe alguno de los ítems a copiar se obtiene un mensaje de error. Cuando tenga algo de tiempo y lo resuelva os lo haré saber.
Para mi sorpresa funciona igualmente si modificamos el script para que haga lo mismo con symlinks o enlaces simbólicos, por lo cual utilizo dos versiones distintas del Servicio: uno para alias y otro para symlinks.

En este caso el script para symlinks sería este:

on run {input, parameters}
set backupSource to first item of input
set backupDestination to second item of input
tell application "Finder"
set everySymlink to every item of folder backupSource
repeat with thisSymlink in everySymlink
set originalFile to (original item of thisSymlink)
duplicate originalFile to backupDestination
end repeat
end tell
end run

NOTA:
Siempre que puedo advierto sobre el cuidado que debemos tener al usar symlinks. No voy a explicar aquí lo que es un enlace simbólico cuando otros lo hacen mejor aquí o aquí. Pero del mismo modo que un symlink es capaz de engañar a una aplicación mostrándose no como un alias sino como si fuera el archivo o carpeta real (lo cual es una gran ventaja para su uso, por ejemplo, con DropBox) en algunos casos es peligroso. He visto cómo alguna utilidad de backup y sincronización no se limitaba a borrar el symlink, sino que eliminaba el archivo original.



No hay comentarios:

Publicar un comentario