Получить полное содержимое каталога с AppleScript - PullRequest
8 голосов
/ 20 января 2010

Мне нужно получить все (видимое) содержимое папки и ее подпапок в виде списка.Возможно ли это?

Ответы [ 3 ]

10 голосов
/ 31 марта 2010

это намного больше работы, чем нужно. Я знаю, что это старый пост, но я хочу, чтобы вы оба поняли, как легко это может быть

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

если вам нужен список имен файлов, вы можете сделать это

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

Из-за комментариев, которые следуют за этим постом, я попросил группу экспертов по бизнесу посмотреть на этот вопрос и оценить наш ответ беспристрастно, и я получил ответ thsis

"Как насчет оспы в обоих ваших домах?: -)

Да, все содержимое делает именно то, что вы говорите, но оно легко задыхается большие папки, и занимает вечность (и один день, если вы на 10,6). Это нормально для мелкие вещи, такие как извлечение всех файлов одного вида из папки, которую вы знать будет содержать только небольшое количество файлов.

Рекурсивный метод также хорошо работает - но он использует "список папок", и список словаря для этого говорит, что это устарело, и мы не должны использовать это больше. "

Так что я слышу, заявляя, что я был неправ! оба эти решения действительны, но имеют «оспы» или дыры в их использовании. Мои аплодисменты Филиппу. Если он решит отредактировать свой ответ (потому что это единственный способ изменить мой голос), я буду рад вернуться и дать ему +1

8 голосов
/ 20 января 2010

Я уверен, что есть команда оболочки, которая может сделать это быстрее, но вот один из способов в чистом Applescript, который дает вам полный контроль над форматированием того, какую информацию вы хотите отобразить.

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

В примечании также есть список приложений с числовыми файлами, которые могут сделать это быстрее, чем Applescript.

ОБНОВЛЕНИЕ: В результате этого обсуждения, здесь снова функция, но на этот раз с использованием обновленного API. Вероятно, для этого может потребоваться некоторая очистка, но он достаточно легко каталогизирует мой рабочий стол (и это глубокая, глубокая папка для меня):

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

Я должен быть подписан на неправильные списки рассылки или пропущен, потому что эти изменения API были введены в действие, и я ни разу не слышал о них. Я использовал свой первый предложенный метод в десятках проектов в основном потому, что это был код, изначально предложенный Apple, и полное отсутствие ошибок при его использовании (даже на момент написания этой статьи) никогда не вызывало у меня необходимости что-либо обновлять. ,

Turnabout - честная игра, и я прошу прощения за злобное понижение до mmcgrail, и я заменяю его повышением. Просто чтобы прояснить, я никогда не думал, что ответ, данный mmcgrail, был неправильным. Это отличный однострочный удобный метод, но я остался в стороне от моих комментариев. Но скорее, это был его отрицательный голос и его заявленный контекст, на который я обиделся. В конце концов, это всего лишь код, и я думаю, что мы все здесь по одной и той же причине: чтобы найти лучший способ сделать то, что мы делаем. Кажется, теперь у меня есть несколько собственных обновлений для принятия.

Приветствия

1 голос
/ 27 декабря 2017

Ух ты, уже довольно поздно, но я проверил, и это работает.

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
...