Получить полное содержимое каталога с помощью AppleScript

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


person Alexsander Akers    schedule 19.01.2010    source источник


Ответы (3)


Я уверен, что есть команда оболочки, которая может сделать это быстрее, но вот один из способов в чистом 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, и полное отсутствие ошибок при его использовании (даже на момент написания этой статьи) никогда не вызывало у меня необходимости что-либо обновлять. .

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

Ваше здоровье

person Philip Regan    schedule 20.01.2010
comment
пишет что-то типа не удается получить каждый элемент диска... - person user2159978; 18.02.2014

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

  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

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

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

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

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

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

person mcgrailm    schedule 31.03.2010
comment
Правильно, потому что огромный список {файла документа Имя файла папки Подпапка папки Папка папки имя пользователя папки Пользователи загрузочного диска приложения Finder, ad nauseum} и необходимость последующей обработки это намного больше полезно, так как требует отрицательного голосования по моему. - person Philip Regan; 31.03.2010
comment
что нужно обработать у вас есть список и вы ссылаетесь на элементы по мере необходимости, т.е. псевдоним элемента в списке файлов, вы делаете гораздо больше работы, чем необходимо, поэтому я дал вам отрицательный голос, я не дал его вам назло где, как кажется, это то, что вы делаете - person mcgrailm; 31.03.2010
comment
также ваш kFileList возвращает список только имен файлов и не указывает, откуда взялся файл, так что же тогда возвращаться через папку, чтобы выяснить, откуда они взялись? - person mcgrailm; 31.03.2010
comment
Это шесть из одного, полдюжины другого сценария. Получив свойства информации о файле заранее, можно легко составить настраиваемый список прямо из ворот, в отличие от получения списка псевдонимов, а затем извлечения желаемой информации постфактум. Меньшее количество строк кода — не всегда лучший и не худший ответ. Пожалуйста, подумайте дважды, прежде чем минусовать. - person Philip Regan; 31.03.2010
comment
@spiteful downvote: Да. Да, я сделал. Твоя была такой же ненужной, как и моя, согласно моему пункту выше. Я редко опускаю голоса (шесть раз в год, в том числе здесь, в то время как вы, кажется, набрали 5 баллов за 3 месяца). Я голосую только за действительно вопиющие ошибки в ответах, но вы, кажется, застали меня в сварливом дне. В следующий раз снова подумайте дважды, прежде чем голосовать против и жертвовать драгоценными баллами только ради того, чтобы показать нам обоим, насколько это просто. Если вам просто не нравится ответ, просто оставьте его в покое. - person Philip Regan; 31.03.2010
comment
Я не согласен, ваш способ расточительный, вы создаете список имен файлов, которые бесполезны, потому что вы не знаете, откуда они взялись, как вы собираетесь что-то с этим делать?? и если бы я хотел, я мог бы просто добавить немного больше кода к тому, что я сделал, см. редактирование @grumpy: нет, не сварливый. ваш код бесполезен и расточительный, и ваш правильный код не ВСЕГДА лучше, но в этом случае я считаю, что это - person mcgrailm; 31.03.2010
comment
что касается голосования против за последние три месяца, то только недавно я уловил ТАК, и я очень редко голосую против, как правило, когда данный ответ не достигает цели или не достигает цели значимым образом. . - person mcgrailm; 31.03.2010
comment
Код, который я предоставил, далеко не бесполезен, и теперь вы начинаете оскорблять. Вы предполагаете, что это может обращаться только к именам файлов. Переменная file_name легко может быть преобразована в список любого подмножества информации о файле. Но моя может на самом деле предложить больше контроля над функциональностью, чем ваша. Например, что, если ОП хочет спуститься только на определенную глубину от стартовой папки, чтобы избежать ненужной каталогизации? Крючки легко добавить в мой, но ваш не может этого сделать. Я предлагаю управление извлечением данных и форматирование заранее, что является всего лишь переходом от того, что вы делаете. Продолжай пытаться, чувак. - person Philip Regan; 01.04.2010
comment
Я очень редко голосую против, как правило, когда данный ответ не достигает цели или не достигает цели значимым образом .... Это очень субъективно. Пожалуйста, ознакомьтесь с принятым ответом на вопрос о том, как использовать голосование против? (meta.stackexchange.com/questions /19268/) ... голосование против должно использоваться для ответа, который является существенно неверным, неуместным, вводящим в заблуждение или предлагает действительно плохой совет. Я ответил на вопрос осмысленно, и это не было неправильным, неуместным или плохим советом. Опять же, дважды подумайте, прежде чем минусовать. До свидания. - person Philip Regan; 01.04.2010

Ничего себе, это довольно поздно, но я проверил, и это работает.

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
person 梁國淦    schedule 27.12.2017