フォルダをドラッグ&ドロップするだけで、そのフォルダの中に含まれているファイルを全て処理できたら便利ですよね。例えば100個のテキストファイルに含まれている文字列を一度に置換したい場合、ファイルを一つ一つ指定するのではなく、そのファイルの納められているフォルダを指定するだけで全てのファイルを処理したくなると思います。ここでは、こういう場合の処理の仕方を解説します。
あるフォルダに納められたファイルのパス名を得る一番簡単な方法は、Finderを使ったものです。中身を調べたいフォルダのパスをthePathとすると、そのフォルダに含まれるファイルの参照は次のようにして得ることができます。
tell application "Finder"
every file of thePath
end tellこれで全てのファイルを得られたのですから、後は各々のファイルに対して処理を行うだけです。例えばファイルに対する処理をtheCommand(aFile)とすると、
tell application "Finder"
set theFiles to every file of thePath
repeat with aFile in theFiles
theCommand(aFile) of me
end repeat
end tell
とすればOKです。
さて、指定したディレクトリ(フォルダ)の直下にあるファイルを扱うのはこれでいいのですが、指定したフォルダの中に更にフォルダがあった場合、そのフォルダの中身も処理できるとよりパワフルなスクリプティングができますね。
on DiveFolder (thePath)
tell application "Finder"
set theFiles to every file of thePath
repeat with aFile in theFiles
theCommand(aFile) of me
end repeat
set theFolders to every folder of thePath
repeat with aFolder in theFolders
DiveFolder (aFolder) of me -- 自分自身を呼び出している
end repeat
end tell
end DiveFolderこの例では、ファイル処理のスクリプトにフォルダ処理を付け加えてみました。これによって、あるフォルダに含まれる全てのファイルパスがtheCommandに渡されることになります。
おもしろいのは、フォルダ処理の部分でスクリプトが自分自身を呼び出していることでしょう。サブルーチン「DiveFolder」中の変数「aFolder」はフォルダですから、本来DiveFolderが自分自身を呼び出すのに不都合はないはずです。しかしこういった再帰的な手法は、慣れていない眼には奇妙に映りますね。