Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get full directory contents with AppleScript

I need to get the entire (visible) contents of a folder and its subfolders as a list. Is this possible?

like image 413
Alexsander Akers Avatar asked Jan 19 '10 21:01

Alexsander Akers


3 Answers

see how easy this can be

  tell application "Finder"
     set file_list to entire contents of (choose folder with prompt "Please select directory.")
   end tell 

if you want a list of file names then you could do this

  tell application "Finder"
    set file_list to name of every file of entire contents of (choose folder with prompt "Please select directory.")
   end tell

Yes, entire contents does exactly what you say -- but it easily chokes on large folders, and takes forever. It's OK for small things, like extracting all the files of one kind out of a folder you know will only contain a small number of files.

The recursive method also works well -- but it's using "list folder", and the dictionary listing for it says it's deprecated and we shouldn't use it any more.

like image 183
mcgrailm Avatar answered Nov 01 '22 03:11

mcgrailm


I'm sure there is a shell command that can do this faster, but here is one way in pure Applescript that gives you total control over formatting what info you would like displayed.

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

On a side note, there are also a number file listing applications that can do this faster than Applescript.

UPDATE: As a result of this discussion, here is the function again, but this time using the updated API. This could probably could use some cleaning up, but it works cataloging my Desktop handily enough (and that's a deep, deep folder for me):

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
like image 38
Philip Regan Avatar answered Nov 01 '22 01:11

Philip Regan


Wow this is quite late but I checked and it works.

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
like image 1
梁國淦 Avatar answered Nov 01 '22 02:11

梁國淦