2010-01-19 29 views

Respuesta

7

Estoy seguro de que hay un comando de shell que puede hacerlo más rápido, pero aquí hay una forma en AppleScript puro que le da control total sobre el formato de la información que le gustaría mostrar.

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 que enumera las aplicaciones que pueden hacer esto más rápido que Applescript.

ACTUALIZACIÓN: Como resultado de esta discusión, aquí está la función otra vez, pero esta vez usando 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 carpeta muy, muy profundo 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 

Debo estar suscrito a las listas de correo de mala calidad o falta uno porque éstos Los cambios API se promulgaron y yo nunca una vez se enteró de ellos. He utilizado mi primer método ofrecido en docenas de proyectos en gran parte porque era el código originalmente ofrecido por Apple, y la falta total de errores al usar esto (incluso en el momento de escribir esto) nunca me provocó la necesidad de actualizar nada .

Turnabout es un juego limpio, y mis disculpas por el rencoroso voto negativo hacia mmcgrail, y lo estoy reemplazando con un voto popular. Para ser claros, nunca pensé que la respuesta dada por mmcgrail fuera incorrecta. Es un excelente método de conveniencia de una línea, pero me he mantenido alejado por mis comentarios ya dados. Pero más bien, fue su voto a la baja y su contexto declarado lo que me ofendió. 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 propias para promulgar.

Saludos

+0

vea mi post – mcgrailm

+0

Hice una edición a mi mensaje – mcgrailm

+0

se escribe algo así como "no puede conseguir todos los elementos de disco ..." – user2159978

10

que es mucho más trabajo de lo necesario. Sé que esto es una entrada antigua pero quiero que tanto para 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 Después de este post pedí a un grupo de expertos en negocios que analizaran esta pregunta y evaluaran nuestra respuesta de manera imparcial y la respuesta que obtuve fue thsis

"¿Qué tal una varicela en sus casas? :-)

Sí, todo el contenido hace exactamente lo que dice, pero se atasca fácilmente en las carpetas grandes de , y demora para siempre (y un día si está en 10.6). Está bien para cosas pequeñas, como extraer todos los archivos de un tipo de una carpeta que saber contendrá solo una pequeña cantidad de archivos.

El método recursivo también funciona bien - pero es el uso de "lista de carpetas", y el listado de Inglés para Dice que es obsoleto y no debe usarlo más "

Así que escucho por. Declaro que estaba equivocado. Ambas soluciones son válidas pero tienen "viruela" o agujeros en sus usos. Mis apologías para Philip.Si decide editar su respuesta (porque esa es la única manera de cambiar mi voto) estaré feliz de regresar y darle 1

+0

Claro, porque una lista masiva de {archivo de documento "nombre de archivo" de la carpeta "SubFolder" de la carpeta "Carpeta" de la carpeta "nombre de usuario" de la carpeta "Usuarios" del disco de inicio de la aplicación "Finder", ad nauseum} y tener que procesar posteriormente * that * es mucho más útil que requerir un down votar por el mío –

+0

lo que está ahí para procesar tienes la lista y su referencia los artículos como sea necesario decir, alias el elemento en la lista de archivos que estás haciendo mucho más trabajo de lo que se necesita es por eso que le di un voto por que no le di a usted de pese donde como eso parece ser lo que estás haciendo – mcgrailm

+0

también su kFileList devuelve una lista de archivos nombrar solamente y ninguna referencia al lugar donde vino el archivo así que lo que luego volver Trough la carpeta de averiguar de dónde vienen? – mcgrailm

0

¡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 
Cuestiones relacionadas