Automator: servicio para mover archivos a nuevas subcarpetas según la extensión del archivo *dentro de cualquier carpeta seleccionada*

He estado buscando durante bastante tiempo, pero parece que no puedo encontrar instrucciones relevantes para esta tarea en particular. Soy nuevo en esto así que pido disculpas si me estoy perdiendo algo básico.

Como muchos fotógrafos, vuelvo de una sesión con una tarjeta que contiene archivos RAW (CR2), JPG y MOV, todo en una sola carpeta. Una vez que copio esta carpeta a mi disco duro, debo realizar las siguientes acciones, para lo cual me gustaría crear un único servicio, de modo que pueda ejecutar este mismo proceso para cualquier carpeta que elija.

Esto es lo que me gustaría automatizar:

  1. Cree carpetas separadas para Raw, JPG y Video dentro de la carpeta seleccionada.
  2. Identifique los archivos de cada tipo y muévalos a las carpetas creadas en el primer paso.

Pensé que esto sería simple, pero el problema parece radicar en mi necesidad de que sea un servicio genérico, no vinculado a ninguna ruta de carpeta específica. Necesito que sea repetible para otras carpetas, pero parece que no puedo descifrar ese aspecto esencial de versatilidad.

Ya encontré y adapté un Apple Script (ver más abajo) que crea las subcarpetas que necesito. Esa parte funciona bien como servicio por sí sola. Pero parece que no puedo realizar el segundo paso que haría el movimiento real del archivo.

Sé cómo mover archivos de cierto tipo a una carpeta específica , pero eso no es lo que necesito. Necesito que todos los JPG en una carpeta determinada se muevan a una nueva subcarpeta llamada JPG dentro de la carpeta seleccionada y lo mismo para los otros tipos de archivos. Entiendo cómo filtrar esos tipos de archivos, pero hasta ahora no puedo descifrar cómo moverlos a una carpeta sin tener que especificar una ruta, no sé cómo señalar carpetas que aún no existen. Incluso si pudiera, esas rutas serán diferentes para cada carpeta en la que necesite trabajar.

¿Alguien puede darme un consejo o señalarme una discusión relevante?

Muchas muchas gracias.

///

Aquí está el Apple Script para mi servicio de creación de subcarpetas:secuencia de comandos de subcarpeta

Texto del guión:

on run {input, parameters}
    set output to {}
    tell application "Finder"
        set {source_folder, source_name} to {it, name} of first item of input
        repeat with prefix in {"JPG - ", "RAW - ", "Edits - ", "Video - "}
            make new folder at source_folder with properties {name:contents of prefix & source_name}
            set end of output to result as alias
        end repeat

Nota: La parte de movimiento de archivos de la automatización no involucrará mi carpeta "Ediciones -". Esto es solo un contenedor para futuros archivos.

¿Seleccionará la carpeta real que se ordenará para ejecutar el servicio, o abrirá la carpeta y luego elegirá ejecutar el servicio desde el menú Finder ?

Respuestas (2)

Si quisiera crear varias carpetas dentro de una carpeta seleccionada y mover los archivos existentes dentro de la carpeta seleccionada, a las carpetas creadas dentro de la carpeta seleccionada, según la extensión del archivo, entonces no usaría AppleScript bash.

El siguiente servicio toma las carpetas seleccionadas en Finder y hace lo siguiente:

  • Crea las siguientes carpetas dentro de la carpeta seleccionada donde "$parent_folder_name" es el nombre de la carpeta seleccionada en la que se ejecuta el servicio:
    • "Ediciones - $parent_folder_name"
    • "JPG - $nombre_carpeta_principal"
    • "RAW - $parent_folder_name"
    • "Vídeo - $parent_folder_name"
  • Mueve los archivos existentes a las carpetas recién creadas según la extensión del archivo.

for f in "$@"; do
    cd "$f"
    d="$(basename "$f")"
    mkdir -p "Edits - $d" "JPG - $d" "Raw - $d" "Video - $d"
    mv *.JPG "./JPG - $d"
    mv *.CR2 "./RAW - $d"
    mv *.MOV "./Video - $d"
done

ingrese la descripción de la imagen aquí

Me siento mal por no usar el hermoso applescript de @CJK, pero decidí que tu bash será más fácil de modificar para un novato como yo más adelante. Funciona perfectamente, muchas gracias! Conozco a mucha gente que estará encantada de tener este atajo.

Partí de la suposición de que seleccionará las carpetas reales para pasarlas a su flujo de trabajo de servicio de Automator a través, por ejemplo, del menú de servicios contextual del botón derecho.

Dado esto, así es como se vería su flujo de trabajo de servicio:

Flujo de trabajo de Automator en macOS

Aquí está el guión que va en la Run AppleScriptacción:

on run input
    set [input] to the input

    repeat with directory in the input
        organiseFilesOfFolder_(POSIX path of the directory)
    end repeat

end run

to organiseFilesOfFolder:f
    local f

    script SourceFolder
        use sys : application "System Events"

        property location : a reference to folder f of sys
        property name : (a reference to name of my location)

        script JPGs
            property folder : missing value
            property name extension : "jpg"
            property list : {}
            property id : "JPG"
        end script

        script RAWfiles
            property folder : missing value
            property name extension : "cr2"
            property list : {}
            property id : "RAW"
        end script

        script Videos
            property folder : missing value
            property name extension : "mov"
            property list : {}
            property id : "Video"
        end script

        script Edits
            property folder : missing value
            property id : "Edits"
        end script


        to make new "folder" given type:fileType
            [fileType's id, " - ", my name's contents]

            make new folder at my location ¬
                with properties {name:¬
                contents of result as text}

            set the folder of the fileType to the result
        end make

        on listOf:fileItems
            set the list of fileItems to (every file ¬
                of my location where its name extension ¬
                is the name extension of the fileItems)
        end listOf:
    end script

    tell the SourceFolder
        repeat with fileType in its [JPGs, RAWfiles, Videos, Edits]
            make new "folder" given type class:fileType
            if the contents of the fileType = its Edits then ¬
                exit repeat

            if (its listOf:fileType) is not {} then ¬
                tell application "System Events" to move ¬
                    list of fileType to the ¬
                    folder of the fileType
        end repeat
    end tell
end organiseFilesOfFolder:
Obviamente, si los requisitos del OP son solo AppleScript, entonces está bien; sin embargo, en mi opinión, es excesivo para una tarea tan simple que se puede realizar en ocho líneas de código usando bashRun Shell Script vs. Run AppleScript. ¡Buen guión, sin embargo!
@ user3439894 dado que el OP proporcionó un intento parcial en AppleScript, creo que CJK está aquí. Si bien creo que ambos enfoques funcionan, creo que esta es la mejor respuesta. +1 aquí
Debo estar de acuerdo con @ user3439894, es una exageración total y no está claro qué extras hace en comparación con su respuesta.
@Buscar웃 si te sientes así, ¿por qué no darle un voto a favor?
@ʀ2ᴅ2 quién eshit
@ ʀ2ᴅ2 OK, tienes razón, acabo de hacer eso, le di a David un voto a favor.
@Buscar웃 estaba en mi teléfono, lo siento hit. Quise decir que si crees que Bash es el mejor enfoque, ¿por qué no votas a favor de la solución? Voté a favor de CJK porque respondió la pregunta con AppleScript puro, ya que parece que esa fue la solicitud. Si el usuario hubiera incluido una solución de AppleScript pero luego hubiera mencionado cómo Bash es mejor, también habría votado a favor de él. Si el usuario hizo eso, entonces esa respuesta sería el mejor enfoque.
@ ʀ2ᴅ2 tenemos el Please avoid extended discussions in comments. así que dejémoslo así. En última instancia, el OP decidirá.
@CJK Esto es hermoso. Muchas gracias por poner tanto esfuerzo. Me ha costado mucho elegir una respuesta pero, lamento decirlo, terminé siguiendo la ruta del script bash. Aunque no es en absoluto tu culpa. Es más fácil para mi cerebro de codificación de bebé entender ese script más simple, lo que hará que las cosas sean menos confusas para mí si necesito modificar el proceso en el futuro. Por encantador que sea tu applescript, me preocuparía arruinar algo si intentara ajustarlo por mi cuenta. Muchas gracias por la rápida y completa respuesta. Muy agradecido por esta comunidad en este momento.