Encuentre un archivo específico con automator

4

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 dispersos en un directorio en particular en mi HD. Los archivos originales AÚN EXISTEN, pero por alguna razón los alias han perdido su conexión. Me gustaría reemplazarlos a todos por enlaces simbólicos, para que Rsync pueda hacerles una copia de seguridad.

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

Ahoraaquíhayunejemplodeunsubdirectorioquecontienelosoriginalesdealgunosdelosaliasrotos,asícomocopiasadicionalesdelmismoalias,queaúnapuntanaotraubicaciónparasusoriginales:

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

Entonces,loquenecesitohaceres:

  1. Identifiquetodoslosaliasenundirectoriodefinidoporelusuario
  2. Uselosnombresdearchivodeesosaliasparaubicarsusarchivosoriginales,enunsegundodirectoriodefinidoporelusuario(recursivamenteyasegurándosedenoidentificarunsegundoaliascomooriginal)
  3. eliminarelalias
  4. creeunenlacesimbólicoalarchivooriginal,enlaubicaciónanteriordelalias

EstoyusandoAutomatorsiemprequepuedo,yApplescriptdondedebo.Antesdelarespuestaquesolicitóestasediciones,miflujodetrabajohizolosiguiente:

  1. Solicitarlaubicaciónparabuscararchivosoriginales
  2. Solicitarubicaciónparabuscaralias
  3. ObtengarutasPOSIXatodoslosalias
  4. Obtengalosnombresdelosarchivosdetextodetodoslosalias

Ahora,vaunpocomáslejosperoconalgunosproblemas:

  1. Teníaunaliastitulado"3dfx & ambience.rfl" (que ya se cambió en las capturas de pantalla a "3dfx y ambience.rfl"). El applecript proporcionado fallaría en ese archivo debido al símbolo "&".
  2. Después de corregir el # 1, la secuencia de comandos 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 los originales en sí 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" que se muestra en mi tercera captura de pantalla.

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

    
pregunta Jonathan van Clute 03.09.2013 - 00:36

3 respuestas

2

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

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

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

  • arrastreysuelteeltokenvariableenelcampodetextodebúsqueda.

ESTA ES UNA ACTUALIZACIÓN

Usando las 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 de Applecript en la carpeta de documentos.

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

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

Las Acciones.

  1. EjecuteApplescript:escribaunscriptdealmacenamientoenlacarpetadedocumentos

Elguión.

setscript_texttoMakeScript()myRunMaker(script_text)onRunMaker(script_text)setfile_pathto(pathtodocumentsfolderasUnicodetext)&"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, pregunte por los elementos del Finder: esto es para la carpeta de alias rotos.

  • Establecer como Ignorar entrada
  • establezca su inicio en: en su carpeta de alias rotos.
  • establezca su Tipo en: Carpeta

3, Ejecutar Applescript:

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

(Las escrituras se realizan cuando el Action Applescript carga la secuencia de comandos del archivo de almacenamiento. Esta será una versión de tipo. A continuación, cambiará las propiedades de su versión y volverá a escribir el archivo nuevamente, 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 contenido de la carpeta:

  • La acción recibe la "ruta de carpeta de alias rota" y obtiene todos los contenidos de la carpeta.

5, elementos del buscador de filtros:

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

Todo: Tipo: es: otro: alias

  • Pase la lista a la siguiente acción

6, Ejecutar Applescript:

Escribe un alias PATHS roto 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, Preguntar por elementos del Finder: esto es para la carpeta de archivos originales.

  • Establecer como Ignorar entrada
  • establezca su inicio en: en su carpeta de archivos originales.
  • establezca su Tipo en: Carpeta

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

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

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

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

  • Crea un enlace simbólico en la carpeta donde se encontraba el alias anterior del archivo coincidente encontrado.

  • Solo se deben eliminar los archivos de alias. Si no se encuentra un 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

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

    
respondido por el markhunte 08.09.2013 - 14:39
2

Por lo general, "alias roto" se refiere a un alias donde el archivo original ya no existe. He usado 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 por los 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
    
respondido por el user495470 03.09.2013 - 10:47
0

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

EDIT si no quieres probar ningún comando de shell:

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

    
respondido por el beroe 07.09.2013 - 18:13

Lea otras preguntas en las etiquetas