Получите полное содержание каталогов с AppleScript
-
21-09-2019 - |
Вопрос
Мне нужно получить все (видимое) содержимое папки и ее подпапки в качестве списка. Это возможно?
Решение
Я уверен, что есть команда оболочки, которая может сделать это быстрее, но вот один из способов в Pure 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, был неправильным. Это отличный метод удобства в одной линии, но тот, который я держался в стороне от моих комментариев, уже данных. Но скорее это был его голосование и заявленный контекст, с которым я обидел. В конце концов, это просто код, и я думаю, что мы все здесь по той же причине: найти лучший способ сделать то, что мы делаем. Кажется, у меня теперь есть некоторые обновления, чтобы вступить в силу.
Ваше здоровье
Другие советы
Это гораздо больше работы, чем необходимо. Я знаю, что это старый пост, но я хочу, чтобы вы оба увидели, насколько легко это может быть
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
Вау, это довольно поздно, но я проверил, и это работает.
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