Вот зародышевый скрипт, который должен помочь вам:
property kTargetFileExtension : "txt"
property pValidFileList : {}
on open of theFiles -- Executed when files or folders are dropped on the script
set fileCount to (get count of items in theFiles)
repeat with thisFile from 1 to fileCount
set theFile to item thisFile of theFiles
tell application "System Events"
set file_info to get info for theFile
end tell
if visible of file_info is true then -- check for the file extension here as well
if folder of file_info is true then
my createList(theFile)
else
set fileName to name of file_info
set targetFileFound to isTargetFile(fileName, kTargetFileExtension) of me
if (targetFileFound) then
set end of pValidFileList to theFile
end if
end if
end if
end repeat
display dialog "pValidFileList = " & pValidFileList
(* do something with your files listed in pValidFileList here *)
end open
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 as alias)
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 fileName to the_item
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 -- check for the file extension here as well
if folder of file_info is true then
my createList(the_item)
else
set targetFileFound to isTargetFile(fileName, kTargetFileExtension) of me
if (targetFileFound) then
set end of pValidFileList to the_item
end if
end if
end if
end repeat
end createList
on isTargetFile(theFilename, theTargetExtension) -- (string, string) as boolean
set AppleScript's text item delimiters to "."
set fileNameList to every text item of theFilename
set AppleScript's text item delimiters to ""
try
set theFileExtension to item 2 of fileNameList as string
on error
return false
end try
if theFileExtension is theTargetExtension then
return true
end if
return false
end isTargetFile
Несколько вещей, на которые стоит обратить внимание:
Системные события - текущая лучшая практика для получениясписки и информация о файлах.Просто запросить все содержимое быстрее, но известно, что это ненадежно.Этот метод обхода вручную медленнее, но нет сомнений, что вы получите нужные вам файлы.
isTargetFile
на самом деле просто работает с именем файла в виде строки, а не полагается на то, что система выдастИнформация.Шесть из одного, полдюжины из другого, если вы спросите меня, но это уменьшает количество вызовов в систему, поэтому я думаю, что это делает это немного быстрее.
Я также склонен добавлять on run {}
блокировать эти вещи, чтобы разрешить ручной выбор папки.Это также облегчает тестирование.
Как использовать:
Сохраните сценарий как приложение, и вы получите каплю (значок приложения Applescript со стрелкой, указывающейвниз).
on open of theFiles
является эквивалентом main()
.Вы можете поместить любую комбинацию файлов и папок на каплю, и она справится с остальными.Он заканчивается списком целевых файлов, которые затем можно просмотреть для обработки.Я оставлю это в качестве упражнения для добавления этого бита.
Чтобы настроить цель, измените строку в первой строке, property kTargetFileExtension : "txt"
, на любое расширение, которое вы ищете.Это также может быть изменено на массив - например, property kTargetFileExtension : {"txt", "rtf", "doc}
, но вам также потребуется обновить isTargetFile(theFilename, theTargetExtension)
, чтобы также просмотреть их.
Кроме того, это просто работает.Прямо сейчас он соберет список txt
файлов для обработки.
Добавьте соль по вкусу.