0 votos

Abrir imágenes aleatorias de varias carpetas con la aplicación de vista previa

Básicamente lo que intento conseguir es lo siguiente:

  1. Crear una lista de alias de cualquier cantidad de carpetas con la selección del Finder.
  2. Obtener todas las imágenes de esas carpetas con un shell script.
  3. Aleatorice esas imágenes.
  4. Abra las imágenes aleatorias en la aplicación de vista previa.

El script que he creado funciona parcialmente con dos carpetas seleccionadas que contienen tres imágenes cada una (6 en total). Pero sólo abre 3 imágenes con la aplicación de vista previa en lugar de las 6.

También lo estoy probando con más de 100 imágenes en dos carpetas distintas y me da error:

"Can’t make file \":43\" into type alias." number -1700 from file ":43" to alias

Además, las imágenes no están siendo aleatorias cada vez que ejecuto el script.

Tenga en cuenta que prefiero usar el shell script para obtener las imágenes porque es mucho más rápido que usar el Finder. Si es posible utilizar también un shell script para aleatorizar las imágenes, me gustaría saber cómo se puede lograr esto en el script que he creado.

Se agradece cualquier ayuda. Gracias.

tell application "Finder"
    if selection is {} then
    else
        set theFolders to selection as alias list

        set theImages to {}
        repeat with aFolder in theFolders
            set getImages to "find " & aFolder's POSIX path's quoted form & " -iname '*.jpg'"
            set end of theImages to paragraphs of (do shell script getImages)
        end repeat

        -- Randomize selected images

        set randomImages to {}
        repeat with thisImage in some item in theImages
            set end of randomImages to thisImage
        end repeat

        -- Get aliases

        set filePaths to {}
        repeat with thisFile in randomImages
            set end of filePaths to (thisFile as POSIX file as alias)
        end repeat

        -- Open random images with Preview

        open filePaths using application file id "com.apple.Preview"

    end if
end tell

1voto

user3439894 Puntos 5883

Arreglar y reescribir el código En particular, en el repeat with aFolder in theFolders bucle y utilizando un manipulador de la respuesta aceptada por Lri en ¿Existe una forma sencilla de barajar una lista en AppleScript? para aleatorizar el lista sobre su método, esto ahora funciona.

Lo he probado en varios carpetas individualmente, así como múltiples carpetas juntos, con hasta 500 JPG archivos en una prueba.

tell application "Finder"
    if not selection is {} then
        set theFolders to selection as alias list
    else
        return
    end if
end tell

set theImages to {}
repeat with aFolder in theFolders
    set getImages to "find " & aFolder's POSIX path's quoted form & " -iname '*.jpg'"
    set tempList to paragraphs of (do shell script getImages)
    repeat with aItem in tempList
        copy aItem to end of theImages
    end repeat
end repeat

set randomImages to shuffle(theImages)

set filePaths to {}
repeat with thisFile in randomImages
    copy (thisFile as POSIX file as alias) to the end of filePaths
end repeat

tell application "Finder" to ¬
    open filePaths using application file id "com.apple.Preview"

### Handlers ###

on shuffle(input)
    script s
        property L : input
    end script
    set i to count of L of s
    repeat while i ≥ 2
        set j to random number from 1 to i
        set {item i of L of s, item j of L of s} to {item j of L of s, item i of L of s}
        set i to i - 1
    end repeat
    L of s
end shuffle

1voto

qarma Puntos 71

Parece que llego un poco tarde a la fiesta, pero aquí hay otra forma de hacerlo. Estoy de acuerdo con usted sobre Buscador siendo lento (a veces porque no se está utilizando de la manera correcta, pero has hecho todo bien). No debería usarse para ninguna operación del sistema de archivos que no sea única para él ( reveal , select , update ) o para acceder a propiedades y objetos que sólo están disponibles a través de Buscador ( selection , Finder window , original item , application file ). En realidad fue sustituido hace años por Eventos del sistema que se hizo cargo de su sistema de archivos y de las capacidades de inspección de procesos, pero muchos de los AppleScripters están atascados en sus costumbres. Eventos del sistema no es tan rápido como el shell, pero no debería notar una diferencia apreciable a menos que esté manejando miles de archivos a la vez. Sin embargo, es aproximadamente infinitas veces más rápido que Buscador .


En primer lugar, definí un objeto script sólo para albergar un par de manejadores y para mejorar la velocidad de acceso a los elementos de la lista:

script filepaths
    property selection : {}
    property list : {}

    to flatten(L)
        script
            property parent : L
            property index : 1

            on |ƒ|()
                set x to {} & item index
                if x = {} then return
                set [[item index], x] to ¬
                    [it, rest] of x
                if x = {} then return
                set the end to x
            end |ƒ|
        end script
        tell result to repeat until index > length
            |ƒ|()
            set index to index + 1
        end repeat
        L
    end flatten

    to shuffle(L)
        script
            property parent : L
            property index : my items
        end script
        tell result
            repeat with i from 1 to length
                set item i in the index to i
            end repeat
            repeat with i from 1 to length
                set k to some item in the index
                set [item k, item i] to ¬
                    [item i, item k]
            end repeat
        end tell
        L
    end shuffle

    to open
        tell application id "com.apple.Finder" to open ¬
            my list using application file id ¬
            "com.apple.Preview"
    end open
end script

No hay nada enormemente complicado. El flatten() tomará una lista de objetos anidados y devolverá una lista aplanada. La página shuffle() barajará una lista de una forma pseudoaleatoria fiable que garantice que todas las permutaciones posibles de una lista tengan la misma probabilidad de surgir. Algunos generadores de números pseudoaleatorios tienen una ligera tendencia a favorecer los elementos que no se encuentran en los límites.

Ese objeto script puede ir a cualquier parte. Entonces la parte principal del script tiene este aspecto:

tell application id "com.apple.Finder" to set the ¬
    selection of filepaths to the selection as ¬
    alias list

tell application id "com.apple.SystemEvents" to repeat with f in ¬
    (a reference to the selection of filepaths)
    if f's kind = "Folder" then set f's contents ¬
        to (the path of the files in f where ¬
        name extension = "jpg" and visible = true)
end repeat

tell filepaths
    set its list to every list in the selection
    flatten(its list)
    shuffle(its list)
    open
end tell

Utiliza Buscador sólo para tomar los archivos seleccionados; utiliza Eventos del sistema para filtrar la selección de modo que sólo se consideren las carpetas, y luego lee el contenido de esas carpetas y muta la lista para que contenga el jpg archivos en esas carpetas.

Esto será una lista anidada, que estaría bien abrir en Vista previa sin más procesamiento, pero para barajarlo, primero hay que aplanarlo. Así que eso se hace, luego se aleatoriza el orden, luego se abren en Vista previa .


He probado esto con unos cientos de imágenes en una docena de carpetas, y fue cegadoramente rápido hasta que estúpidamente las abrí todas en Vista previa En ese momento me arrepentí. Esperemos que tengas una máquina más potente que la mía, porque la mía ahora se está asando en caliente y requiere un reinicio.

0voto

Mockman Puntos 16

Sé que pediste una solución principalmente de shell script, pero tuve problemas al tratar de generar una lista plana de archivos usando 'find'. Sin embargo, tengo una solución de applescript.

tell application "Finder"
    set theFolders to selection as alias list

-- Create list of jpegs within selected folders
    set fColl to {}
    repeat with eachSet in theFolders
        set imgF to (files whose name extension is "jpg") of eachSet as alias list
        repeat with c1 from 1 to count of imgF
            copy item c1 of imgF to end of fColl
        end repeat
    end repeat

-- Choose random images to open
    set rndImgs to {}
    repeat until (count of rndImgs) is 3
        set r1 to some item of fColl
        if rndImgs does not contain r1 then
            copy r1 to end of rndImgs
        end if
    end repeat
    open rndImgs
end tell

He leído en algún sitio que usar Eventos del Sistema para abrir archivos en lugar del Finder puede ser más rápido pero no tengo pruebas de ello.

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