4 votos

Buscar 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 concreto de 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 puedan ser respaldados por Rsync.

Este es un ejemplo a escala de una carpeta con alias rotos en ella:

enter image description here

A continuación se muestra un ejemplo de un subdirectorio que contiene tanto los originales de algunos de los alias rotos, como copias adicionales del MISMO alias, que siguen apuntando a otra ubicación para sus originales:

enter image description here

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

enter image description here

Así que lo que tengo que hacer es:

  1. Identificar todos los alias en un directorio definido por el usuario
  2. Utilizar los nombres de archivo de esos alias para localizar sus archivos originales, en un segundo directorio definido por el usuario (de forma recursiva 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 antigua ubicación del alias

Estoy usando Automator siempre que puedo, y Applescript siempre que debo. Antes de la respuesta que provocó estas ediciones, mi flujo de trabajo hacía lo siguiente:

  1. Pide la ubicación para buscar los archivos originales
  2. Preguntar por la ubicación para buscar alias
  3. Obtener las rutas POSIX de todos los alias
  4. Obtener los nombres de los archivos de texto de todos los alias

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

  1. Tenía un alias titulado "3dfx & ambience.rfl" (cambiado ya en las capturas de pantalla por "3dfx and ambience.rfl"). El applescript proporcionado fallaba en ese archivo debido al ampersand.
  2. Después de arreglar #1, el scriptse ejecutó y efectivamente eliminó los alias rotos y los reemplazó con enlaces simbólicos. Pero los enlaces simbólicos apuntaban a la carpeta padre que contenía los originales, no a los originales mismos. 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" mostrada en mi tercera captura de pantalla.

Esperemos que esto sea suficiente detalle para llegar finalmente a una solución que funcione. Puedo decir que está muy cerca.

2voto

Normalmente "alias roto" se refiere a un alias donde el archivo original ya no existe. He utilizado este script para encontrar alias así:

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 el script 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

2voto

Malik hassan Puntos 16

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

El paso del nombre del archivo de una acción a un variable de ajuste Acción

  • establecer la acción de Spotlight para ignorar la acción anterior. Para ello, haga clic con el botón derecho del ratón en la barra de título y utilice el menú.

enter image description here

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

enter image description here


ESTO ES UNA ACTUALIZACIÓN

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 utilizará para almacenar la información que vayamos obteniendo por el camino y recuperarla posteriormente en la acción final de Applescript.

Hacemos esto porque necesitamos pasarle al script</strkeep><strkeep> final varios bits de información. Lo que no podemos hacer con las variables normales de Automator.

Las acciones.

enter image description here

  1. Ejecuta Applescript: Escribe un un almacenamiento script en la carpeta de documentos

El script.

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, Pide los artículos del buscador: Esto es para la carpeta Broken Alias.

  • Ajustar para ignorar la entrada
  • pon tu inicio en: en tu carpeta de alias rotos.
  • pon tu Tipo a: Carpeta

3,Ejecutar Applescript:

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

( Las salidas de escritura las realiza el Action Applescript cargando el archivo de almacenamiento script. Esto será una especie de versión. Luego cambiará las propiedades en su versión y reescribirá el archivo de nuevo reemplazando el antiguo)

--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:

  • Filtra los elementos para que sólo contengan archivos de alias.

Todos: Tipo : es : otro : alias

  • Pasar la lista a la siguiente Acción

6, Ejecutar Applescript:

Escribe el alias roto PATHS en una propiedad del archivo script.

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, Preguntar por los elementos del buscador: Esto es para la carpeta de archivos originales.

  • Ajustar para ignorar la entrada
  • establezca su inicio en: en su carpeta de archivos originales.
  • pon tu Tipo a: Carpeta

8,Ejecutar Applescript:

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

 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, Ejecutar Applescript:

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

  • Intenta encontrar un archivo que coincida en la carpeta de archivos originales. Buscará todas las coincidencias pero ignorará los alias.

  • Eliminar el antiguo archivo Alias (comprobando primero que es un archivo alias)

  • Cree un enlace simbólico en la carpeta en la que estaba el antiguo alias a partir del archivo coincidente encontrado.

  • Sólo se deben eliminar los archivos de alias. Si no se encuentra ningún archivo que coincida, el archivo de alias no se borrará. 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

Pruebe primero use bajo su propio riesgo y todo eso..

0voto

beroe Puntos 1605

Puede utilizar mdfind que 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 quieres intentar usar ningún comando del shell:

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

spotlight screenshot...

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X