Pregunta

necesito para obtener los contenidos enteros (visibles) de una carpeta y sus subcarpetas como una lista. ¿Es esto posible?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top