スクリプトの標準的な機能とFinderの操作だけでファイル検索を行うこともできますが、あまりにも遅いため実用的ではありません。ここではアプリケーション「UltraFind」またはOSAX「Find File」「Find document」を使ったファイル検索の方法について述べます。(OSAXの部分は現在制作中です)
UltraFind ファイル検索用のスクリプティング対応アプリケーションです。ファイル検索に関する全ての機能がスクリプトから操作可能ですが、後からスクリプトに対応したソフトにありがちな操作上の癖が随所に見られます。
まず、このアプリケーションはアクティベートができません。スクリプトから利用する場合は常にバックグラウンドで動作することになります。
また、検索に必要なパラメータはレコードで一括して受け渡すのではなく一つ一つ設定していく必要があります。 これと同様に、検索結果もスクリプトに直接返されるのではなく、スクリプトの側から改めて取得する必要があります。
例えば、文字列「sample」をファイル名に持つファイルを検索する場合、次のように設定します。
tell application "UltraFind 2.5"
set the text of fileName of its searchRoutine to "sample"
end tell「its」を忘れると動作しないので注意して下さい。検索設定は clear で解除し、検索実行は scan で行います。
次は検索結果の取得です。見つかったファイル数は scan の result として返されますが、検索されたファイルそのものの情報はスクリプトからアプリケーションに問い合わせる必要があります。
tell application "UltraFind 2.5"
clear
set the text of fileName of its searchRoutine to "sample"
scan
set FileNum to result
the accessPath of fileRecord 1
end tellsearchRoutine や fileRecord を直接操作することはできません。それぞれのクラスのプロパティのみを操作することが可能です。上の例では searchRoutine の fileName に"sample"を与え、その検索結果 fileRecord の accessPath を得ています。
全ての検索結果について特定のプロパティ(例えば accessPath)を得たい場合は、次のようにするといいでしょう。
tell application "UltraFind 2.5"
clear
set the text of fileName of its searchRoutine to "sound"
scan
set FileNum to result
if filenum is not 0 then
set ResList to {}
repeat with i from 1 to FileNum
set ResList to ResList & {the accessPath of fileRecord i}
end repeat
end if
end tellこれで ResList に全てのファイルのパスが入ります。
最初は扱いが少々面倒ですが、慣れてくるとそれなりに使えるようになってきます。ソフトウェアの安定度はOSAXよりはるかに高いので、業務に使用する場合は当面このアプリケーションを使用する方がよいと思います。
Find File このOSAXは、あまりAppleScriptらしくないスクリプティングを要求されます。書式は次の通り。
Find File {vRefNum, "SearchString", [FileAttributes], [LoDateSecs, HiDateSecs]}
--結果は該当ファイルまたはフォルダのフルパス名のリストだいたい vRefNum が必要なOSAXというのも初めて見ましたが… これについては「Volume Info」というOSAXで得ることができるものの、今度はパラメータに Volume Number が必要になるという (^ ^;) しかも作成日による検索は日時を秒で与えなければならないし、ほとんど開発者専用という雰囲気が漂ってます。しかし UltraFind と違い、スクリプトからの扱いはさすがに簡単で、しかもフリーウェア。これを使わない手はないでしょう。
ではまず、 vRefNum を取得することから始めましょう。
とりあえず、「Volume Info」の書式は以下の通りです。
VolInfo integer
--結果は Volume Name, vRefNum, Available Bytes のレコード単純にボリューム番号を与えれば結果を返してくれますが、その番号はどうやって得るわけ? という疑問が湧きます。とりあえずボリューム名はFinderで取得できますから、integerを1から順番に増やしていって、ボリュームが全部出そろったところで繰り返しを抜けることにしましょうか。