0 votos

Selección de un archivo aleatorio de una subcarpeta aleatoria en AppleScript

Estoy escribiendo AppleScript para cambiar el fondo de mi escritorio a una foto aleatoria de una subcarpeta aleatoria. Mi estructura de carpetas de fotos consiste en subcarpetas anidadas que pueden tener varios niveles de profundidad. Por el momento tengo un simple script que selecciona un archivo al azar de UNA carpeta. Pero, ¿cómo puedo hacer que seleccione una imagen aleatoria de una subcarpeta aleatoria (que podría tener varios niveles de profundidad)? Se agradece cualquier ayuda.

Esto es lo que tengo hasta ahora, que cambia el fondo de escritorio a una foto aleatoria de una sola carpeta, pero necesito que también busque en las subcarpetas anidadas:

tell application "Finder"
    set randomimage to some file of folder "Macintosh HD:Users:mrawesome:My Photos:Australia" as string
end tell

tell application "System Events"
    tell every desktop
        set random order to false
        set picture to randomimage
    end tell
end tell

0voto

wch1zpink Puntos 11

Prueba esto

property theFolder : "Macintosh HD:Users:mrawesome:My Photos:Australia"

set randomImage to some item of paragraphs of (do shell script "find " & ¬
    quoted form of POSIX path of theFolder & ¬
    " -iname \"*.jpg\" -or -iname \"*.png\" -or -iname \"*.tiff\"")

tell application "System Events" to tell every desktop
    set {random order, picture} to {false, randomImage}
end tell

0 votos

¡Increíble! Gracias @wch1zpink - Eso funciona absolutamente perfecto y extremadamente rápido también. Mi carpeta de fotos y subcarpetas contienen más de 45.000 fotos y tu script vuelve al instante. Gracias de nuevo, muy apreciado.

0voto

red_menace Puntos 111

Hay varias formas de obtener archivos de subcarpetas anidadas.

El Buscador tiene el entire contents pero tenga en cuenta que puede ahogarse en estructuras de carpetas grandes:

set theFolder to (choose folder)
tell application "Finder" to set theFiles to (get every document file in entire contents of theFolder as alias list)
set randomImage to (some item of theFiles)

También se pueden utilizar los eventos del sistema, aunque habría que descender manualmente por el árbol de directorios. Al igual que el Finder, también habría que buscar el tipo de archivos deseado (imágenes, etc.) si no se quiere todo (se mezclan tipos de documentos, por ejemplo):

set theFolder to (choose folder)
set theFiles to getFiles from theFolder # given extension:"png", UTI:"public.jpeg" -- or whatever
set randomImage to (some item of theFiles)

# Get files (optionally with the extensions or UTIs), recursively descending the directory tree
to getFiles from someItems given extension:extension : {}, UTI:UTI : {}
   set foundList to {} -- this will be a list of found items
   repeat with anItem in (someItems as list)
      set anItem to anItem as text
      tell application "System Events"
         if class of disk item anItem is in {"folder", folder} then -- folder
            set subFolders to (get path of disk items of folder anItem whose visible is true)
            set foundList to foundList & my (getFiles from subFolders given extension:extension, UTI:UTI)
         else -- file
            if (UTI is {} and extension is {}) or ¬
               (type identifier of file anItem is in UTI) or ¬
               (name extension of file anItem is in extension) then
               set foundList to foundList & {anItem as alias}
            end if
         end if
      end tell
   end repeat
   return foundList
end getFiles

Su mejor opción podría ser el mdfind shell script, que además de ser bastante rápido, puede coincidir con UTIs más genéricos (aunque los archivos deben ser indexados por Spotlight):

set theFolder to (choose folder)
set imageFiles to paragraphs of (do shell script "mdfind -onlyin " & quoted form of POSIX path of theFolder & space & quote & " kMDItemContentTypeTree == 'public.image'" & quote)
set randomImage to (some item of imageFiles) as POSIX file

0 votos

Muchas gracias @red_menace por contestar. No pude probar tu respuesta ya que la solución de wch1zpink me funcionó. Pero tu respuesta parece que va a hacer el trabajo y definitivamente ayudará a otros en el futuro. Gracias de nuevo.

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