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