指定フォルダ(デスクトップ)内の指定拡張子のファイルのうち、ファイル名が指定キーワードではじまるものを抽出するAppleScriptです。
AppleScriptでは定番の処理ですが、Finderが10.7あたりでCocoa化されて書き直しが行われたあたりからフィルタ参照を併用した条件抽出のパフォーマンスが大幅に低下。
アプリケーション間通信でパフォーマンスを低下させないための機能であるフィルタ参照が、かえって処理速度を低下させるというたいへん皮肉な事態に。
AppleScript名:指定フォルダ内の指定拡張子のファイルのうち、指定キーワードで始まるものをaliasリストで返す(Finder Version) |
tell application "Finder" tell folder (path to desktop) set aList to (every file whose name starts with "スナップショット" and kind of it is "PNGイメージ") as alias list end tell end tell |
Finder経由で行うと、処理時間は驚愕の4.6秒(67項目から1項目を抽出するだけの処理です)。これをCocoaの機能を用いて処理すると0.002秒。同じAppleScriptなのに2,000倍以上高速。逆にいえば、現在のFinder経由でのファイル処理の速度は遅すぎです。
macOS 10.10以降では、各種ファイル処理についてはFinderではなくCocoaの機能を用いたほうがよいでしょう。
その他、Finder上で選択中のファイルの一覧を取得するとか、Finder上で選択中のフォルダを取得するといった処理であればパフォーマンスの低下はないので、使っても(処理速度上の)問題はありません。
AppleScript名:指定フォルダ内の指定拡張子のファイルのうち、指定キーワードで始まるものをPOSIX pathリストで返す |
— Created 2015-10-01 by Takaaki Naganoya — Modified 2015-10-01 by Shane Stanley–With Cocoa-Style Filtering — Modified 2018-07-03 by Takaaki Naganoya–Added filtering feature use AppleScript version "2.5" use scripting additions use framework "Foundation" property |NSURL| : a reference to current application’s |NSURL| property NSPredicate : a reference to current application’s NSPredicate property NSFileManager : a reference to current application’s NSFileManager property NSDirectoryEnumerationSkipsHiddenFiles : a reference to current application’s NSDirectoryEnumerationSkipsHiddenFiles set aExtension to "png" — no dot set aKeyword to "スナップショット" –"Snapshot" in Japanese set aTargetFolder to POSIX path of (path to desktop folder) set fList to getFilePathListByExtAndKeyword(aTargetFolder, aExtension, aKeyword) of me –> {"/Users/me/Desktop/スナップショット-2018-07-03 at 11_42_12 AM-1696613812.png"} on getFilePathListByExtAndKeyword(aFol, aExt, aKeyword) set aFM to NSFileManager’s defaultManager() set aURL to |NSURL|’s fileURLWithPath:aFol set urlArray to aFM’s contentsOfDirectoryAtURL:aURL includingPropertiesForKeys:{} options:(NSDirectoryEnumerationSkipsHiddenFiles) |error|:(missing value) set thePred to NSPredicate’s predicateWithFormat:"pathExtension == [c]%@ && lastPathComponent BEGINSWITH %@" argumentArray:{aExt, aKeyword} set anArray to (urlArray’s filteredArrayUsingPredicate:thePred) if anArray = missing value then return {} return (anArray’s valueForKeyPath:"path") as list end getFilePathListByExtAndKeyword |
More from my site
(Visited 1,243 times, 3 visits today)