Encuentra un archivo específico con Automator

La pregunta básica es:

¿Cómo puedo pasar un nombre de archivo al módulo de búsqueda de Spotlight en Automator?

El problema esencial:

Tengo cientos de alias rotos repartidos por un directorio en particular en mi disco duro. Los archivos originales TODAVÍA EXISTEN, pero por alguna razón los alias han perdido su conexión. Me gustaría reemplazarlos todos con enlaces simbólicos, para que Rsync pueda respaldarlos.

Aquí hay un ejemplo reducido de una carpeta con alias rotos:

ingrese la descripción de la imagen aquí

Ahora, aquí hay un ejemplo de un subdirectorio que contiene los originales de algunos de los alias rotos, así como copias adicionales del MISMO alias, que aún apuntan a otra ubicación para sus originales:

ingrese la descripción de la imagen aquí

Y, por último, aquí hay una imagen de un directorio que contiene los archivos maestros de algunos de los alias que estaban ubicados en las 2 ubicaciones anteriores:

ingrese la descripción de la imagen aquí

Así que lo que tengo que hacer es:

  1. Identificar todos los alias en un directorio definido por el usuario
  2. Use los nombres de archivo de esos alias para ubicar sus archivos originales, en un segundo directorio definido por el usuario (recursivamente y asegurándose de no identificar un segundo alias como original)
  3. eliminar el alias
  4. crear un enlace simbólico al archivo original, en la ubicación anterior del alias

Uso Automator siempre que puedo y Applescript donde debo hacerlo. Antes de la respuesta que provocó estas ediciones, mi flujo de trabajo hizo lo siguiente:

  1. Solicitar la ubicación para buscar archivos originales
  2. Solicitar ubicación para buscar alias
  3. Obtenga rutas POSIX para todos los alias
  4. Obtener nombres de archivos de texto de todos los alias

Ahora, va un poco más lejos pero con algunos problemas:

  1. Tenía un alias titulado "3dfx & ambience.rfl" (ya cambiado en las capturas de pantalla a "3dfx and ambience.rfl"). El applescript proporcionado fallaría en ese archivo debido al ampersand.
  2. Después de corregir el n. ° 1, el script se ejecutó y, de hecho, eliminó los alias rotos y los reemplazó con enlaces simbólicos. Pero los enlaces simbólicos apuntaban a la carpeta principal que contenía los originales, no a los originales en sí. Así que terminé con 2 enlaces simbólicos, "Luftrum 1 - Thor Ambient.rfl" y "Luftrum 2 - Thor Ambient II.rfl", que en realidad apuntaban a la carpeta "Luftrum" que se muestra en mi tercera captura de pantalla anterior.

Con suerte, esto será suficiente detalle para finalmente llegar a una solución que funcione. Puedo decir que está muy cerca.

He estado jugando con Spotlight para editar mi respuesta y tengo algunas ideas sobre esto ... Si hace que Spotlight funcione a través de Automator, ¿cómo sabrá que el resultado no es el alias muerto u otro archivo con el mismo nombre simple? ? Sería genial tener la herramienta que describes, pero parece arriesgado implementarla de esta manera. ¡Puede ser una buena motivación para aprender shell o python!
Te he dejado una respuesta. Que el script funciona. Pero sería más fácil para nosotros mostrarle cómo pasar la lista a una acción si nos muestra cómo se forman/formatean sus listas. Y cómo los estás consiguiendo realmente. es decir, el resultado final y cómo llegaste allí
@beroe: es bastante fácil en Automator filtrar primero el contenido de una carpeta, hasta solo los alias. markhunte - ¡Agradezco mucho su respuesta! Espero que mi pregunta editada ahora te ayude a ver lo que estoy tratando de hacer.
Hola, he actualizado la respuesta.

Respuestas (3)

Si simplemente desea pasar un nombre de archivo a la acción Spotlight

Pasar el nombre del archivo de una acción a una variable establecida Acción

  • configure la Acción Spotlight para ignorar cualquier acción anterior. Se hace haciendo clic derecho en su barra de título y usando el menú.

ingrese la descripción de la imagen aquí

  • arrastre y suelte el token variable en el campo de texto de búsqueda.

ingrese la descripción de la imagen aquí


ESTA ES UNA ACTUALIZACION

Uso de acciones de Automator y Applescript para almacenar propiedades para su posterior recuperación:

La idea aquí es que la primera acción escribe un archivo applescript en la carpeta de documentos.

El script se usará para almacenar información que obtengamos en el camino y luego recuperarla más tarde en la acción final de Applescript.

Hacemos esto porque necesitamos pasar el script final con múltiples bits de información. Lo cual no podemos hacer con las variables normales en Automator.

Las acciones.

ingrese la descripción de la imagen aquí

  1. Ejecute Applescript: escriba un script de almacenamiento en la carpeta de documentos

La secuencia de comandos.

set script_text to MakeScript()
my RunMaker(script_text)

on RunMaker(script_text)
    set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt"
    set file_path to POSIX path of file_path as string
    store script script_text in file_path with replacing
end RunMaker


on MakeScript()

    script
        property theBrokenAliasFolderPath : ""
        property broken_alias_file_Paths : {}

        property theOriginalFolderPath : ""
        property Original_file_Paths : {}


        property SearchfileNames : {}

    end script
end MakeScript

2, Solicitar elementos del buscador: esto es para la carpeta Broken Alias.

  • Establecer para ignorar entrada
  • establezca su inicio en: en su carpeta de alias rota.
  • establezca su Tipo en: Carpeta

3, ejecute Applescript:

  • Escribe la ruta de la carpeta de alias rota a una propiedad en el archivo de secuencia de comandos de almacenamiento.
  • pasar la ruta a la siguiente acción

(Las escrituras se realizan mediante Action Applescript que carga el script del archivo de almacenamiento. Esta será una especie de versión. Luego cambiará las propiedades en su versión y volverá a escribir el archivo reemplazando el anterior)

--WRITE OUT BROKEN ALIAS FOLDER PATH


on run {input, parameters}

    set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt" as alias

    set script_text to load script file_path

    set theBrokenAliasFolderPath of script_text to (POSIX path of (item 1 of input))


    my RunMaker(script_text)

    return input
end run



on RunMaker(script_text)
    set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt"
    set file_path to POSIX path of file_path as string
    store script script_text in file_path with replacing
end RunMaker

4, obtener el contenido de la carpeta:

  • La acción recibe la "ruta de la carpeta de alias rota" y obtiene todo el contenido de la carpeta.

5, elementos del buscador de filtros:

  • Filtre los elementos para que solo contengan archivos de alias.

Todos: Tipo: es: otro: alias

  • Pasar la lista a la siguiente Acción

6, Ejecute Applescript:

Escribe PATHS de alias rotos en una propiedad en el archivo de script de almacenamiento.

on run {input, parameters}

    set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt" as alias

    set script_text to load script file_path

    set broken_alias_file_Paths of script_text to input


    my RunMaker(script_text)

    return input
end run
on RunMaker(script_text)
    set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt"
    set file_path to POSIX path of file_path as string
    store script script_text in file_path with replacing
end RunMaker

7, Solicitar elementos del buscador: esto es para la carpeta de archivos originales.

  • Establecer para ignorar entrada
  • establezca su inicio en: en su carpeta de archivos originales.
  • establezca su Tipo en: Carpeta

8, ejecute Applescript:

Escribe la carpeta de archivos originales en una propiedad en el archivo de script de almacenamiento.

 on run {input, parameters}

        set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt" as alias

        set script_text to load script file_path

        set theOriginalFolderPath of script_text to (POSIX path of (item 1 of input))


        my RunMaker(script_text)

        return input
    end run



    on RunMaker(script_text)
        set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt"
        set file_path to POSIX path of file_path as string
        store script script_text in file_path with replacing
    end RunMaker

9, Ejecute Applescript:

Esto recupera la información del script de almacenamiento. Esto tomará la lista de rutas de los archivos de alias inactivos.

  • Pruebe y busque un archivo coincidente en la carpeta Archivos originales. Buscará todas las coincidencias pero ignorará los alias.

  • Elimine el antiguo archivo de alias (verifique primero que sea un archivo de alias)

  • Cree un enlace simbólico en la carpeta en la que se encontraba el alias anterior desde el archivo coincidente encontrado.

  • Solo se deben eliminar los archivos de alias. Si no se encuentra ningún archivo coincidente, el archivo de alias no se eliminará. Tampoco se creará un enlace simbólico.

.

set file_path to (path to documents folder as Unicode text) & "MyProperties.scpt" as alias

            set theScript to load script file_path


            --choose a search folder
            set searchPath to quoted form of theOriginalFolderPath of theScript
            set folderPath to quoted form of theBrokenAliasFolderPath of theScript
            set input to broken_alias_file_Paths of theScript


            repeat with i from 1 to count of items of input

                set this_item to item i of input

                set aliasPath to this_item

                #Get the the file name
                set theFileName to "\\\"" & (do shell script "basename " & quoted form of (POSIX path of (this_item))) & "\\\"" as string
                log theFileName

                #search the searchPath for a matching file with the same name.
                #NOTE: this will find all files with he same name. So We use last paragraph to get what should be the first one it finds.
                set theOrigFilePath to paragraphs of (do shell script "mdfind -onlyin " & searchPath & " kMDItemFSName == \"" & theFileName & "\"")


                if theOrigFilePath is not quoted form of "" then

                    repeat with i from 1 to count of items in theOrigFilePath

                        set this_item to item i of theOrigFilePath
                        log this_item
                        tell application "Finder"

                            #make sure we are pointing to an alais that will be deleted and not another symlink file. Otherwise the original file will be deleted.

                            set theKind to kind of ((POSIX file this_item) as alias)

                            if theKind is not equal to "Alias" then
                                set this_item to quoted form of (item i of theOrigFilePath)
                                my symLink(aliasPath, this_item)
                            end if


                        end tell


                    end repeat



                end if

            end repeat


            on symLink(aliasPath, aOrigFilePath)

                #move to trash the old alias file

                set theOldAlias to aliasPath
                tell application "Finder"

                    #make sure we are pointing to an alais that will be deleted and not another symlink file. Otherwise the original file will be deleted.

                    set theKind to kind of theOldAlias
                    set theNewFilePath to (POSIX path of (aliasPath)) as string
                    if theKind is equal to "Alias" then
                        delete theOldAlias

                        log "ln -s  " & aOrigFilePath & space & (quoted form of theNewFilePath)
                        #create the symlink
                        do shell script "ln -s  " & aOrigFilePath & space & (quoted form of theNewFilePath)
                    end if
                end tell
            end symLink

Prueba primero... úsalo bajo tu propio riesgo y todo eso...

¡Santo shiatzu! Esto suena como exactamente lo que necesito. ¡Lo probaré lo antes posible! No sabía que se podía arrastrar y soltar una variable como esa, ¡genial! Desafortunadamente, creo que eso solo funcionará para valores únicos, no para listas. Pero su applescript parece ser la respuesta. Todavía usa algunos scripts de shell que esperaba evitar, pero he aceptado que probablemente no haya otra manera. Gracias, les haré saber si esto resuelve el problema para mí!
Cerca pero sin cigarro. Movió 2 alias rotos a la papelera, pero los originales de ambos estaban ubicados dentro de una carpeta llamada "Luftrum". El script creó 2 enlaces simbólicos de esa carpeta, renombró cada uno con los nombres de los alias muertos y los colocó en el lugar correcto. Así que ahora tengo 2 alias con nombres diferentes pero idénticos a una carpeta, que contiene elementos que no son solo los elementos de alias inactivos reales. Intentaré solucionar esto yo mismo, pero es posible que pueda hacerlo más rápido y si puede editar su respuesta, ¡se lo agradecería!
Observación adicional, muere en nombres de archivo que contienen ampersands. Parece que necesitan escaparse, pero no estoy seguro de la sintaxis para lograrlo.
Uh oh... Otro problema serio es que tengo múltiples alias en algunos casos. Entonces, el script asume que el primer nombre de archivo coincidente encontrado es el original cuando puede que no lo sea. También debería verificar que no sea un alias. Voy a intentar arreglar esto yo mismo, pero en caso de que falle, sería increíble si pudieras hacer este ajuste también. =)
Hola. No entiendo sus dos primeros problemas cuando ejecuto las pruebas. El primer problema, si lo entiendo correctamente, parece que el script está encontrando los archivos originales, pero los nombres de los archivos no se pasan al código del enlace simbólico. También me funciona probar en un ie en una carpeta llamada "una carpeta con & ya". Applescript puede tener problemas con algunos idiomas y su codificación de texto cuando se trata de archivos y carpetas. Sospecho que este es el caso. Pero realmente necesita mostrar un ejemplo de cómo se organizan sus alias y archivos y cómo se estructura su lista. Y sálvanos trabajando a partir de tu descripción redactada..
Me encantaría, estos cuadros de comentarios simplemente no me permiten hacer cosas como adjuntar capturas de pantalla o formatear texto de una manera más legible. Supongo que puedo editar mi pregunta original... pero eso parece extraño ya que las adiciones se aplican estrictamente a su respuesta. ¿Cómo sugieres que te brinde los detalles que ayudarían?
Puedes mostrarlo en tu pregunta. Mostrando un ejemplo de la estructura de las listas, capturas de pantalla de cómo se organizan sus archivos. etc. amplía su pregunta con información relevante. Sólo asegúrese de explicar qué partes son cuáles. :-) Esto nos dará una idea de lo que realmente estás tratando de hacer. (Espero)
Actualicé la respuesta.
Interesante actualización, le echaré un vistazo. Sin embargo, tengo curiosidad por saber por qué está utilizando un archivo externo para almacenar lo que equivale a variables, cuando puede asignar variables que ya están en Automator y recuperarlas más tarde. ¿Hay algún inconveniente en el uso de variables con Automator?
Construí este flujo de trabajo y se ejecuta sin ningún error. Sin embargo, tampoco hace nada. Los valores de todas las propiedades en MyProperties.scpt están vacíos.
Quiero pasar más de una variable al script final. Hacerlo de la manera normal no me permite hacer eso. HASTA DONDE SE. No quería hacerlo más complejo de lo que ya es.
Si abre MyProperties.scpt, aparecerán vacíos. Pero si su secuencia de comandos se ejecutó correctamente, los valores estarán dentro de las propiedades independientemente de que abra el archivo. Sospecho que tal vez haya un error en la construcción. Puedo publicar un enlace a mi flujo de trabajo.
Gracias, esperaré tu enlace y lo compararé con el mío. No veo nada malo en la construcción, todo funciona perfectamente hasta el script final que simplemente no arroja resultados. Pero lo averiguará una vez que publique el suyo. ¡Gracias de nuevo!
¡Ajá! Tenías razón, me había perdido una "entrada ignorada". Ahora se ejecuta y parece haber funcionado correctamente, con una excepción. Queda un solo alias que se ignoró, y no veo ninguna razón obvia para ello. Voy a explorar esto un poco más a mayor escala y ver si encuentra algún otro problema. ¡Muchas gracias de nuevo! Le otorgaré la recompensa en breve, siempre que esto no necesite preguntas de seguimiento adicionales.
Parece que hay 1 problema restante, con el que puedo vivir y solucionar si es necesario. 1) De alguna manera, muchos de mis alias se han establecido como el archivo original, y cuando encuentra estos archivos, el flujo de trabajo los salta. Si puede detectar fácilmente el problema que causa este problema, genial. Pero si no, entonces puedo solucionarlo con bastante facilidad.
2 problemas adicionales: 1) Después de correr de 5 a 10 minutos, decidí vaciar la papelera que se estaba llenando rápidamente. Esto provocó que el flujo de trabajo se cancelara debido a que "Finder está ocupado" y cuando intento ejecutarlo nuevamente, falla inmediatamente después de seleccionar la primera carpeta, con "Demasiados archivos abiertos". Salir y volver a iniciar Automator le permite volver a ejecutarse. 2) La velocidad a la que se realizan las operaciones se ralentiza con cada enlace simbólico generado. Los primeros van muy rápido, pero después de 100 o más, obviamente se está ralentizando, y después de varios cientos, tarda un par de segundos por enlace.
Cuando tengo un min. Probablemente podría configurarlo para recopilar todas las coincidencias, todos los enlaces simbólicos que necesita hacer, todas las eliminaciones primero en las listas. Luego haz cada operación de una sola vez. Pero hacer algo como esto llevará un tiempo cuando lo haga en tantos archivos como lo que sugiere.
Sí, eso tiene sentido. A menos que solo tenga ganas de hacer ejercicio, yo personalmente digo que no hay necesidad de molestarse. ¡Esto me lleva a donde necesitaba estar, y no puedo agradecerles lo suficiente! Te he otorgado la recompensa y marcado esto como la solución. Cualquier cosa que elijas hacer más allá de esto, es pura generosidad. :)
En caso de que esté interesado en seguir mi progreso con esto... Tengo un nuevo problema que publiqué como otra pregunta: apple.stackexchange.com/questions/101878/…

Por lo general, "alias roto" se refiere a un alias donde el archivo original ya no existe. He usado este script para encontrar alias como ese:

set l to {}
tell application "Finder"
    try
        alias files of entire contents of (POSIX file "/Users/username" as alias)
        result as list
    on error
        return
    end try
    repeat with f in result
        try
            original item of contents of f
        on error
            --move contents of f to trash
            set end of l to POSIX path of (f as text)
        end try
    end repeat
end tell
set text item delimiters to linefeed
l as text

Si la secuencia de comandos encuentra los alias que desea reemplazar los enlaces simbólicos, guarde las líneas relevantes de la salida en un archivo de texto. Luego intente ejecutar un script de shell como este:

cat /tmp/aliases.txt | while IFS= read -r f; do
  original=$(find ~/directory/with/original/files -name "${f##*/}" | head -n1)
  echo "$f:$original"
  # rm "$f"; ln -s "$original" "$f"
done
Desafortunadamente (?), no es así en mi caso. Los archivos originales SÍ existen. No sé por qué se rompieron los alias. Mirando Obtener información, veo que todos apuntan a SÍ MISMOS como el original. También en su código (y no soy mucho de AppleScripter, así que perdóneme), parece comenzar creando un alias de todo en un directorio completo. ¿Porqué es eso? No tengo claro qué haría eso para ayudar. Actualmente itero a través de todos los alias en un directorio e intento obtener el contenido original y, si falla, sé que tengo un alias roto. Así que encontrarlos es fácil, es encontrar su archivo original en el que estoy atascado.
alias files of entire contents of (POSIX file "/Users/username" as alias)solo obtiene una lista de todos los archivos de alias en /Users/username. También puede intentar extraer las rutas originales de las bifurcaciones de recursos con algo como cat example.txt\ alias/..namedfork/rsrc | strings.
Ya tengo todos los archivos de alias y todas sus rutas. Automator me dio eso fácilmente, ese no es el problema. El problema es que no puedo realizar una búsqueda en los nombres de archivo para ubicar los archivos originales en otro lugar de mi disco. Existen y están ubicados en algún lugar debajo de un directorio específico, pero podrían estar en cualquiera de los cientos de otros subdirectorios.

Podría usar mdfindcuál es la versión de línea de comandos de Spotlight en un subíndice de shell en Automator. Puede pasar variables hacia y desde este script/comando a través de stdin y stdout.

EDITAR si no desea intentar usar ningún comando de shell:

¿Intentó establecer un valor de una variable en Automator, luego hizo clic con el botón derecho en el cuadro de entrada de Spotlight y eligió "Nueva variable..." en la parte inferior de la lista emergente?

captura de pantalla de foco...

Gracias pero sin mucho más detalle, eso está sobre mi cabeza. Realmente estoy tratando de evitar tener que salir de Automator para ejecutar secuencias de comandos. A lo sumo, preferiría seguir con AppleScript básico, pero incluso eso sería un último recurso. Solo quiero pasar una variable como entrada al módulo Spotlight.
Acabo de darme cuenta de la edición de este comentario. No puedo usar una variable de esta manera porque la entrada es una lista de elementos y el automatizador no maneja las listas de la manera anterior. Tienes que recurrir a AppleScript o shell scripting. =(