Obtener los contenidos del directorio completo con AppleScript
-
21-09-2019 - |
Pregunta
necesito para obtener los contenidos enteros (visibles) de una carpeta y sus subcarpetas como una lista. ¿Es esto posible?
Solución
Estoy seguro de que hay un comando de shell que puede hacer esto más rápido, pero aquí es una forma pura en Applescript que le da un control total sobre el formato de lo información que desea que se muestren.
property kFileList : {}
tell application "Finder"
set source_folder to choose folder with prompt "Please select directory."
my createList(source_folder)
end tell
on createList(item_list)
set the the_items to list folder item_list without invisibles
set item_list to item_list as string
repeat with i from 1 to number of items in the the_items
set the_item to item i of the the_items
set the_item to (item_list & the_item) as alias
set this_info to info for the_item
set file_name to name of this_info
set end of kFileList to file_name
if folder of this_info is true then
my createList(the_item)
end if
end repeat
end createList
En una nota lateral, también hay un archivo de número de lista de aplicaciones que pueden hacer esto más rápido que Applescript.
ACTUALIZACIÓN: Como resultado de esta discusión, aquí es la función de nuevo, pero esta vez utilizando la API actualizada. Esto probablemente podría podría utilizar algo de limpieza, pero funciona catalogación de mi escritorio cómodamente suficiente (y eso es una profunda, profunda carpeta para mí):
property kFileList : {}
tell application "Finder"
set source_folder to choose folder with prompt "Please select directory."
my createList(source_folder)
end tell
return kFileList
on createList(mSource_folder)
set item_list to ""
tell application "System Events"
set item_list to get the name of every disk item of mSource_folder
end tell
set item_count to (get count of items in item_list)
repeat with i from 1 to item_count
set the_properties to ""
set the_item to item i of the item_list
set the_item to ((mSource_folder & the_item) as string) as alias
tell application "System Events"
set file_info to get info for the_item
end tell
if visible of file_info is true then
set file_name to displayed name of file_info
set end of kFileList to file_name
if folder of file_info is true then
my createList(the_item)
end if
end if
end repeat
end createList
Me debe estar suscrito a las listas de correo mal o que falta, porque se promulgaron estos cambios en la API y yo ni una sola vez oído hablar de ellos. He usado mi primer método ofrecido en proyectos de gran parte porque era el código ofrecido inicialmente por Apple, y la falta completa de errores que utilizan este (incluso en el momento de escribir estas líneas) nunca provocó una necesidad para mí nada docenas de actualización .
Turnabout es juego limpio, y mis disculpas por la downvote rencoroso a mmcgrail, y yo sustituyo con un upvote. Para ser claros, nunca pensé que la respuesta dada por mmcgrail estaba mal. Es un gran método de conveniencia de una sola línea, pero uno He estado alejado desde por mis comentarios ya dadas. Sino más bien, era su voto hacia abajo y su contexto indicado que tomé delito. Al final, es solo código, y creo que todos estamos aquí por la misma razón: para encontrar una mejor manera de hacer lo que hacemos. Parece que ahora tengo algunas actualizaciones de mi propia promulgar.
Saludos
Otros consejos
que es mucho más trabajo de lo necesario. Sé que esto es una entrada antigua pero quiero que tanto permite ver lo fácil que puede ser
tell application "Finder"
set file_list to entire contents of (choose folder with prompt "Please select directory.")
end tell
si desea una lista de nombres de archivo, entonces podría hacer esto
tell application "Finder"
set file_list to name of every file of entire contents of (choose folder with prompt "Please select directory.")
end tell
Debido a los comentarios que siguen este post le pregunté a un grupo de expertos en el negocio para vistazo a esta pregunta y evaluar nuestra respuesta de una manera imparcial y la respuesta que obtuve fue thsis
"¿Qué tal una sífilis en ambas sus casas: -?)
Sí, todo el contenido hace exactamente lo que dice - pero fácilmente se ahoga con carpetas de gran tamaño, y tarda una eternidad y un día (si se encuentra en 10.6). Está bien para cosas pequeñas, como la extracción de todos los archivos de uno fuera una especie de carpeta conocimientos contendrá solamente un pequeño número de archivos.
El método recursivo también funciona bien - pero es el uso de "lista de carpetas", y el diccionario de la lista que dice que está obsoleto y no debe usarlo más. "
Así que oyen por declarar que estaba equivocado! Ambas soluciones son válidas, pero tienen "pox" o agujeros en sus usos. Mis applogies a Philip. Si decide editar su respuesta (porque esa es la única manera de cambiar mi voto) estaré feliz de regresar y darle 1
¡este es bastante tarde, pero he comprobado y funciona.
tell application "Finder" to set folder_root to (choose folder with prompt "Please select directory.")
set fl to {}
dump_folder(folder_root)
on dump_folder(f)
global fl
tell application "System Events" to set end of fl to (get the POSIX path of f)
tell application "Finder" to set nfl to (the items of the contents of f)
repeat with nf in nfl
dump_folder(nf as alias)
end repeat
end dump_folder
fl