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