Google Drive File Stream上でSpotlight Indexを生成するAppleScriptです。
Google Driveには、Gmailのオマケでついてくる個人のデバイス間で情報のシンクロを行う目的のPersonal版(DropboxのGoogle版的なもの)と、企業内やグループ内でファイル共有を行うG SuiteのGoodle Drive File Streamがあり、後者についてはGoogleによる「Google Drive File Stream」ツールが提供され、GoogleDriveをデスクトップにマウントできます。
実際にGoogle Drive File Streamを使ってみたところ、デフォルト状態だとSpotlight検索が効きませんでした。
そこで、Index生成してみたものの…既存のファイルについてはSpotlight検索できませんでした。Index生成後に、新規追加したファイルについてはSpotlight検索が有効でした。
後日談:ただ、Google Drive File Streamに対してSpotlight Indexを常時生成するようにすると、CPUに対する負荷が大きくなるため、実際の運用ではSpotlightを無効にして運用するようにしました。
AppleScript名:Google Drive File Streamでインデックス生成 |
do shell script "mdutil -E /Volumes/GoogleDrive/" with administrator privileges |
自分が試したのは、Google Drive File Stream内の「マイドライブ」領域のみで、
「グループドライブ」領域についてはまだテストできていません。
既存のファイルについては、mdimportコマンドでインデックス作成すれば大丈夫だと思っていますが、実際に試してみると予想外の挙動を行うのかもしれません。
AppleScript名:GDFS上でSpotlight検索 |
— Created 2016-06-17 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" property NSArray : a reference to current application’s NSArray property NSPredicate : a reference to current application’s NSPredicate property NSSortDescriptor : a reference to current application’s NSSortDescriptor property NSMetadataQuery : a reference to current application’s NSMetadataQuery property NSNotificationCenter : a reference to current application’s NSNotificationCenter property NSMetadataQueryDidUpdateNotification : a reference to current application’s NSMetadataQueryDidUpdateNotification property NSMetadataQueryDidFinishGatheringNotification : a reference to current application’s NSMetadataQueryDidFinishGatheringNotification property searchRes : {} set origPath to POSIX path of (choose folder) set aList to spotlightSearch(origPath, "kMDItemContentType == ’public.png’") of me on spotlightSearch(origPath, aMDfindParam) set my searchRes to {} –initialize initiateSearchForFullPath(aMDfindParam, origPath) –Predicate & Scope Directory –Waiting for the result repeat while my searchRes = {} delay 0.01 end repeat set anObj to my searchRes’s firstObject() –Pick up the first one for test if anObj = missing value then return {} –No Result set resArray to {} repeat with anItem in my searchRes set j to contents of anItem set aPath to (j’s valueForAttribute:"kMDItemPath") as string set the end of resArray to aPath end repeat return resArray end spotlightSearch on initiateSearchForFullPath(aQueryStrings, origPath) set aSearch to NSMetadataQuery’s alloc()’s init() NSNotificationCenter’s defaultCenter()’s addObserver:(me) selector:"queryDidUpdate:" |name|:(NSMetadataQueryDidUpdateNotification) object:aSearch NSNotificationCenter’s defaultCenter()’s addObserver:(me) selector:"initalGatherComplete:" |name|:(NSMetadataQueryDidFinishGatheringNotification) object:aSearch set aPredicate to NSPredicate’s predicateWithFormat:aQueryStrings aSearch’s setPredicate:aPredicate set aScope to NSArray’s arrayWithObjects:{origPath} aSearch’s setSearchScopes:aScope set sortKeys to NSSortDescriptor’s sortDescriptorWithKey:"kMDItemFSName" ascending:true aSearch’s setSortDescriptors:(NSArray’s arrayWithObject:sortKeys) aSearch’s startQuery() end initiateSearchForFullPath on queryDidUpdate:sender log sender –> (NSConcreteNotification) NSConcreteNotification 0x7fa618450820 {name = NSMetadataQueryDidFinishGatheringNotification; object = <NSMetadataQuery: 0x7fa6172c6ca0>} end queryDidUpdate: on initalGatherComplete:sender set anObject to sender’s object anObject’s stopQuery() NSNotificationCenter’s defaultCenter()’s removeObserver:me |name|:(NSMetadataQueryDidUpdateNotification) object:anObject NSNotificationCenter’s defaultCenter()’s removeObserver:me |name|:(NSMetadataQueryDidFinishGatheringNotification) object:anObject set my searchRes to anObject’s results() end initalGatherComplete: |