フォルダに含まれる全てのファイルを処理する

1997.7.7


 フォルダをドラッグ&ドロップするだけで、そのフォルダの中に含まれているファイルを全て処理できたら便利ですよね。

 例えば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が自分自身を呼び出すのに不都合はないはずです。しかしこういった再帰的な手法は、慣れていない眼には奇妙に映りますね。


Tipsに戻る
AppleScriptのページに戻る
このホームページに関するお問い合わせは、karino@drycarbon.comまで。