ラベル Finder の投稿を表示しています。 すべての投稿を表示
ラベル Finder の投稿を表示しています。 すべての投稿を表示

アプリケーションによるファイル参照

ファイルを扱うアプリケーション...、Finder や System Events でのファイル参照について。

どうも AppleScript によるファイル参照とこれらのアプリケーションによるファイルの参照がごちゃごちゃになっていて変なエラーに悩まされている...という人を時折見かけます。

AppleScript の分かりにくい部分ですね。

この違いとアプリケーションとの連携をみていきましょう。


それはオブジェクトの参照です

まずは、Finder や System Events などでのファイル指定はファイルの参照ではなく、アプリケーションが扱うオブジェクトへの参照...ということを理解しましょう。

次のスクリプトを実行してみましょう。

tell application id "com.apple.finder"
    -- デスクトップにあるファイルを指定
    set theFile to file 1 of desktop
end tell
-- ファイルの内容を読み込む
read theFile

このスクリプトはエラーになります。もし、この参照が AppleScript でのファイルの参照ならエラーにならないはずです。

この参照は Finder のオブジェクトの参照にすぎず、ファイルの参照ではありません。まずはこのことを理解しましょう。

オブジェクトの参照

AppleScript は、アプリケーションやオブジェクトに対してなんらかの命令を送り、なんらかの処理を行う...と思っていると理解の妨げになるかもしれません。

AppleScript で行う操作の大部分はオブジェクトの属性の変更です。そのために頻繁に用いる命令は set です。AppleScript は tell 構文で処理するターゲットを指定し、set で処理を行うことがほとんどです。極端な話、tell と set の使い方が分かれば、AppleScript の大半は理解できるのではないか?と思っているぐらいです。

AppleScript では処理するオブジェクトやオブジェクトの属性を指定するために頻繁に参照を利用します。もちろん、これはファイル参照とは別物です。オブジェクト参照とは、処理したいオブジェクトを特定するものです。

オブジェクト参照は、目的のオブジェクトからコンテナ(オブジェクトが入っている容れ物)へと of をつなげて作ります。

目的のオブジェクト of オブジェクトの容れ物 2 of オブジェクトの容れ物 1

デスクトップにあるフォルダの中の最初のファイルを Finder で指定するには次のようになります。

tell application id "com.apple.finder"
    file 1 of folder 2 of desktop
end tell

英語の文法的には問題ないんですけどね、これで。スクリプトの意味としては『アプケーション Finder のデスクトップにある 2 つめのフォルダの中にある最初のファイルオブジェクト』ぐらいの意味で、それ以上でも以下でもない。

通常はオブジェクトの参照を使ってファイルになんらかの処理を行います。

tell application id "com.apple.finder"
    -- 重要なファイルなのでロックしておいてね
    set locked of file 1 of folder 2 of desktop to true
end tell

このようにオブジェクトが持っている属性を変更(もしくは取得)します。

おそらく、この辺りの参照でつまづく人は Finder がファイルやフォルダの処理を行うアプリケーションだから、ファイルに対する入出力も Finder を通して行うだろう、と勝手に予測をしてしまうからではないでしょうか。

Finder を通して得た参照には Finder で行う処理以外はできません。ファイルの移動や複製、エイリアスの作成やロック、コメントの付加など Finder で行う操作はできます。逆に言うとこれらの操作は AppleScript 単体ではできません。あくまで Finder(もしくは、System Events)を通してのみできる操作です。

ただ、Finder と AppleScript の親和性は高いので、alias による参照は Finder で利用できますし、Finder のファイル・フォルダオブジェクトの参照を alias に変換することはできます。

この変換は他のアプリケーションでファイルを利用するために必要になってきます(大多数のアプリケーションでは alias 参照を通してファイルを処理します)。

tell application id "com.apple.finder"
    -- Finder の参照を alias クラスに変換
    set theFile to file 1 of folder 2 of desktop as alias
end tell
-- 他のアプリケーションでは alias による参照を使ってね
tell application "Safari"
    open theFile
end tell

alias を Finder に渡してもそのまま処理してくれます。

-- デスクトップにあるファイルの alias 参照
set theFile to alias ((path to desktop as text) & "test.scpt")
tell application "Finder"
    -- 複製を作る
    duplicate theFile
end tell

しかし、これは Finder が alias を利用できるというだけで、他のアプリケーションでもこのように利用できるというわけではありません。どこまで利用できるかはそのアプリケーションを調べてみないことにはなんとも言えません(ファイルやフォルダの処理は System Events でも同様なことができます。また、alias も扱えるので、Finder の代替としても利用できます)。

理解をさらに困難にさせるのが AppleScript の file クラスと Finder の file クラスというように同音異義語が多数登場することです。

このような同音異義語がどのような文脈で利用されているか...これを意識していないと変なエラーに悩まされることになります。

Finder でファイル参照

アプリケーションを通してなんらかの処理を行う...これが AppleScript の正しい使い方です。その処理に特化したアプリケーションを使えば効率がいいし、ぶっちゃけ楽だからです。

Finder で選択しているファイルを AppleScript の基本的な機能だけで取得するのは困難ですが、Finder を使えば一行です。

tell application id "com.apple.finder"
    -- 現在選択している項目を alias で取得
    set theseItems to selection as alias list
end tell
repeat with thisItem in theseItems
    (* 個々の項目に対しての処理を記述 *)
end repeat

また、Finder では alias list というクラスが定義されていて、ファイルやフォルダオブジェクトの参照を alias で一括して取得することができます。他のアプリケーションに渡す場合は、このようにして一括で処理できます。

最前面にあるウィンドウのファイル一覧を得るには次のようにします。

tell application id "com.apple.finder"
    -- 前面のウィンドウに表示されているファイル一覧を取得
    set theseFiles to files of Finder window 1 as alias list
end tell

Finder は、フィルタ参照(条件に合致したオブジェクトを特定するための参照方法)を使えるので、デスクトップ上にある拡張子が scpt でロックがかかっているファイルの一覧などという複雑なファイル指定も行えます。

tell application id "com.apple.finder"
    -- デスクトップにある拡張子 scpt でロックされているファイルの一覧
    files of desktop whose name extension is "scpt" and locked is true
end tell

ただ、POSIX path への変換は Finder のオブジェクトからはできないので、ちょっと手間がかかります。

tell application id "com.apple.finder"
    -- 選択項目を alias で取得
    set fileList to selection as alias list
end tell
-- POSIX パスに変換
repeat with thisItem in fileList
    set contents of thisItem to POSIX path of thisItem
end repeat

ひとてま必要なのがツラいところです。

System Events でファイル参照

System Events は Finder と同じようにファイルやフォルダを操作することができます。が、両者に互換性はなく、ちょっと癖があります。

tell application id "com.apple.systemevents"
    -- デスクトップにあるファイル一覧を取得
    set fileList to file of desktop folder
end tell

このスクリプトを実行してみると分かりますが、不可視のファイルも取得しています。Finder では不可視のファイルは無視します。

また、Finder のように一括で alias に変換するような方法もありません。その代わりに path と POSIX path という属性があるので、この属性を使って一括で取得することができます。

tell application id "com.apple.systemevents"
    -- デスクトップにある全ファイルの HFS パスを取得
    set pathList to path of file of desktop folder
    -- デスクトップにある全ファイルの POSIX パスを取得
    set POSIXpathList to POSIX path of file of desktop folder
end tell

System Events でもフィルタ参照が使えるので Finder でやったような条件に合致したオブジェクトを取得することができます。

tell application id "com.apple.systemevents"
    -- デスクトップにある拡張子 scpt のファイルの HFS パスを取得
    set pathList to path of files of desktop folder whose name extension is "scpt"
end tell

まとめ

このようにファイルを処理する方法が複数用意されているということが AppleScript の理解の妨げになっているような気がします。

そのため、ファイル処理だけを統一的に扱うためのスクリプトを作っている、という人もいます。

個人的にはファイルやフォルダの処理には Finder を使っています。慣れているし、System Events を使うより圧倒的に楽だからです。

肝心なのはアプリケーションによるオブジェクトの参照と AppleScriptの alias や file による参照を混同しないこと。複数のアプリケーションの連携を行うなら、オブジェクトの参照から alias の参照に変換する、もしくは POSIX パスに変換しておくといった処理をアプリケーションの境界で行っておくことです。

この辺りのことを意識しておけば、不用意なエラーに悩まされることは少なくなると思います。

Mavericks の Finder タグをスクリプトから操作

Mavericks の新機能の一つに『タグ』があります。

ファイルやフォルダに付加することができ、OS 全体で利用できます。タグの使い方は「[K]【マニュアル】ファイル管理が超捗る!Appleの新OS『OS X Mavericks』のFinderタグ機能の使い方 - Knowledge Colors」が分かりやすかったです。

Finder にあったラベルが拡張されたようですが、AppleScript からは取得も設定もできないようです。

Finder のラベルは AppleScript で操作できるんですが...。

ちょっと調べたところ、NSURL の NSURLTagNamesKey で設定されているタグは取得できるんですね。なら、ASOC ライブラリで作ってしまいましょう。

新しく AppleScript/Objective-C ライブラリスクリプトを作成し、以下のように記述。

Script Editor で開く

property NSURL : class "NSURL"

on tags(thisFile)
    (*
        タグをリストで取得する
    *)
    set fileURL to NSURL's fileURLWithPath:thisFile
    set dict to fileURL's resourceValuesForKeys:{current application's NSURLTagNamesKey} |error|:(missing value)
    set tagList to dict's objectForKey:"NSURLTagNamesKey"
    if tagList is missing value then return missing value
    return (tagList as list)
end tags

次のようにして呼び出します。

Script Editor で開く

set theFile to choose file

tell script "Tags"
    tags(POSIX path of theFile)
end tell

タグがない場合は missing value が返ります。

では、設定はどうでしょうか。

タグの設定は NSURL の setResourceValue:forKey:error: メソッドで NSURLTagNamesKey を指定して設定できます。

Script Editor で開く

on setTags(tagList, thisFile)
    (*
        現在付けられているタグを上書き
    *)
    set fileURL to NSURL's fileURLWithPath:thisFile
    fileURL's setResourceValue:tagList forKey:(current application's NSURLTagNamesKey) |error|:(missing value)
end setTags

使ってみます。

Script Editor で開く

set theFile to choose file

tell script "Tags"
    setTags({"オレンジ", "レッド"}, POSIX path of theFile)
end tell

これもできました...が、既に設定しているタグを上書きするようです。設定しているタグをそのままに、新しく追加するには次のようにします。

Script Editor で開く

on addTags(tagList, thisFile)
    (*
        現在付けられているタグに追加
    *)
    set currentTags to tags(thisFile)
    if currentTags is missing value then set currentTags to {}
    repeat with i from 1 to count tagList
        set tag to item i of tagList
        if currentTags does not contain tag then
            set currentTags to currentTags & tag
        end if
    end repeat

    setTags(currentTags, thisFile)
end addTags

現在のタグに含まれないタグだけを新しいタグのリストから追加しています。これで追加も可能になりました。

ASOC を使ったライブラリですのでちょっと手間がかかりますが、これでタグを自由自在。ま、そのうち AppleScript のみで利用できるようになるのでしょうが、それまでの代替です。

Finder Toolbar Scripts について

前の記事で Finder Toolbar Scripts を公開したのだけど、まさか、影響を受けた方にご紹介をしていただけるとは思っていませんでした。わかばマークのMacの備忘録さんが詳細な使い方を書いて紹介してくださっていました。他人任せはいかんよな...と少し反省。そんなわけで、同梱の Read Me に書かなかったことをいくつか。

いずれのスクリプトも「実行専用」ではありません。中身を見てご自由に改変してくださって結構です。個人の利用の範囲内で。

分かりにくいかなと思っていましたが、やっぱり分かりにくかった「Favorite Window」(なら、どうにかしろよと思わないでもない)。最前面の Finder window の設定(Finder の「表示オプションを表示」メニューで変更できるいくつかの設定)を覚えておくためのものです。初回起動時に設定を覚えます。Finder ではいつも 1 つだけウィンドウを表示させて使っているのですが、閉じて、再度ウィンドウを表示させたときに以前の設定が再現されないことにストレスが溜まり作ったものです。その昔あった Apple で配布されていた Finder Toolbar Scripts に含まれていた Snapshot というスクリプトに啓発されたものです(といって、このスクリプトの存在を知っている人も少なくなったでしょうね)。

「Go to Package Folder」は、パッケージ形式のファイルの内容を新しい Finder window で表示するスクリプト。うちでは、rtfd などのパッケージ形式のファイルでも大丈夫だったのですが、開かなかったでしょうか(誰に聞いているのだ)?

「Grouping」は修正日を指定し、それに合致したファイルとフォルダを別のフォルダに移動してまとめるスクリプトです。デフォルトでは別のフォルダは今日の日付になりますが。これは、ユーザーが選択したフォルダに移動させることができます。

スクリプトを Script Editor で開くと最初に以下の属性が宣言されています。

property usesSelectSimilarItems : false
property groupingFromUserFolder : false
property groupingByModification : true

usesSelectSimilarItems を、true にすると Select Similar Items と同じような挙動を行います。groupingFromUserFolder を true にすると フォルダ選択ダイアログが表示され、ユーザーが選択したフォルダに項目を移動するようになります。groupingByModification を false にすると項目を作成日で検索するようになります。

usesSelectSimilarItems が true の場合は、選択項目が優先されます。修正日(作成日)は無視されます。

property usesSelectSimilarItems : true
property groupingFromUserFolder : true
property groupingByModification : true

このように変更すると、現在選択している項目と同じような項目をすべて選択し、それら全てをユーザーが選択したフォルダに移動させることができます。

property usesSelectSimilarItems : false
property groupingFromUserFolder : true
property groupingByModification : false

このように変更すると、作成日で項目を検索し、ユーザーが選択したフォルダに項目を移動させます。...うまく、伝わっているでしょうか? この説明...。とにかく、スクリプト先頭の上記の属性を変更すれば挙動を変えることができます。お試しくださいませ。

「Reduce File Size」は PDF ファイルに Quartz Filter を適用するスクリプトです。これもスクリプトを Script Editor で開いて先頭の

property usesUserFilter : false

を true に変えることで他の Quartz Filter を利用することができます。OS にはいくつか Quartz Filter がインストールされています。それらのなかに Reduce File Size.qfilter とこのスクリプトと同じ名前のものがあります。こちらの方がファイルサイズは抑えられるかもしれません。

後、このスクリプトはドロップレットです。Quartz Filter を適用したい PDF だけをこのスクリプトに放り込んでください。ちなみに、ファイルサイズが大きくなってしまうのはバグではありません。なぜか Quartz Filter では、こうなってしまうようです。

「Select Similar Items」は、macosxhints.com で以前に取り上げられていたものです。その着眼点はいいと思ったのですが、肝心のスクリプトはそりゃないだろう、と思ったので作り直したものです。が、おそらく多くの人は「Select Similar Items」の中身を見て「そりゃないだろう」と言うだろうと思います(何で、この目的のためにそんな面倒なことをしているのかと)。

Finder window をカラムで表示していると JPEG ファイルだけを選択するのが苦痛だったりします。名前順で並んでいて、点在しているので。

例えば、JPEG ファイルを 1 つだけ選択し、「Select Similar Items」を実行すると全ての JPEG ファイルを選択します。これで、ファイルをまとめて移動するのが楽になります。

拡張子を見て動作するので拡張子がない場合は...どうなるのでしょう?

「Update」は Finder 項目の強制的な更新を行うスクリプト。アプリケーションを作っているとアイコンが反映されなかったりすることがあるので、そういうときに使います。それ以外に使い道はあるのか、と今ふと思いました。どうなんでしょう?

Mac OS X 10.4 でも動くのですが、動けないようにしてしまったりしています。以下のスクリプトが中身なのですが、これはそのまま 10.4 で利用できます。

tell application "Finder" to update items of "対象となるフォルダ" with necessity

ASU はできるだけ目立たないように存在していますので、そのままそっとしておいてください。詳しくは Read Me を読んでください、としか言えないです。

なんで、わざと不便な設定で配布しているんだ、という突っ込みが聞こえそうです。まぁ、スクリプトを開いて中身をのぞいてみるときの楽しみというか、なんというか...。

では、お楽しみください。

Finder Toolbar Scripts

わかばマークのMacの備忘録さんの Finder Toolbar Scripts の記事を見て、脊髄反射的ににいくつか Finder Toolbar Script を作ってしまった。

Finder Toolbar Scripts

何が一番面倒だったかというと、Read Me ファイルを作ることだったりします。なんで、そんなところに時間をかけるんだよう。

で、そうこうしているうちにわかばマークのMacの備忘録さんは、さらにバージョンアップしたものを公開していたり...。

通常、ここで簡単にスクリプトの説明等をしておくのがいいのでしょうが、先にも書いたように Read Me に時間をかけてしまったため、もう気力がないです。

Read Me を読んでください。

Charan's Finder Toolbar Scripts

Finder の alias list、使えるみたい

Mac OS X 10.4 の Finder(10.4 以前でも?)では、alias list が使えなかった。alias list は Finder で定義されているクラス。これを使うとファイルやフォルダの参照を Finder の参照ではなく、alias 参照のリストで返してくれる。

Script Editor で開く

tell application "Finder"
    set curSelection to selection as alias list
end tell

いちいち as alias と型変換をしなくていいので便利なのだけど、Mac OS X 10.4 では選択されている項目がひとつだけだとエラーになって動かなかった。また、複数を選択していても alias 参照に変換してくれなかった。だから、Finder の選択項目を処理する時はわざわざ次のように繰り返しで alias 参照に変換していた。

Script Editor で開く

tell application "Finder"
    set curSelection to selection

    if curSelection is {} then return

    set theseItems to {}
    repeat with thisItem in curSelection
        set end of theseItems to thisItem as alias
    end repeat

    theseItems
end tell

Mac OS X 10.5 でもこのバグの名残を見る事ができます。/Library/Scripts/Printing Scripts に入っている Convert to PDF.scpt などのスクリプトを開いて見ると、run ハンドラの最初の方で奇妙な事をしています。分かってて長いことほったらかしだったんですね(Convert to PDF.scpt の作成日が 2003 年なんですから)。

Mac OS X 10.5 の Finder では、alias list がようやく使えるようになりました。きちんと結果が返ってきます。でも、Mac OS X 10.4 が現役な事を考えると、上記のような配慮は必要なんでしょうね。まだまだ。

Automator を使って楽をする - その他編

Finder 編、iPhoto 編と続けてきましたが、今回はその他のワークフロー。Mail 編、Safari 編...と続けていけばいいのでしょうが、どうにも数がでてこないし...。なので、便利かなと思えるワークフローなどまとめて紹介。

  • VIDEO_TS を指定して再生
    1. DVD を再生
  • ムービーブラウザ
    1. 選択された Finder 項目を取得
    2. ムービーをブラウズ
  • ダウンローダー
    1. Safari の現在の Web ページを取得
    2. Web ページからリンク URL を取得
    3. URL にフィルタを適用
    4. URL をダウンロード

「DVD を再生」アクションは、再生時の動作を指定することが出来ます。その中に VIDEO_TS を指定するオプションがあります。これを指定してアプリケーションで保存しておけば、VIDEO_TS をアプリケーションにドラッグ & ドロップして即座に DVD Player.app で再生を開始することが出来ます。

Safari の「ムービーをブラウズ」アクションは、QuickTime Player が再生できるファイルを渡すと Safari などのブラウザで閲覧できる HTML を作成してくれます。ここでは「選択された Finder 項目を取得」を最初に持ってきていますが、「ムービーをブラウズ」アクションが渡されたファイルをフィルタリングしてくれるので、なくても構いません。

Automator にはサンプルワークフローとして Safari から画像をダウンロードするワークフローがついていますが、こちらはリンクにフィルタをかけてからダウンロードするダウンローダー。リンクの最後が zip で終わっているなどと指定することで柔軟な一括ダウンロードを実現します。

次は、PDF 関連。

  • ウォーターマーク
    1. PDF にウォーターマークを描画
  • 結合
    1. 選択された Finder 項目を取得
    2. Finder 項目を並べ替える
    3. PDF ページを結合
    4. PDF 書類を名称変更
    5. Finder 項目を移動
  • ファイルサイズを圧縮
    1. 選択された Finder 項目を取得
    2. Finder 項目をコピー
    3. Quartz フィルタを PDF 書類に適用

PDF 関連のアクションは、不可視のテンポラリーフォルダに PDF を作成するので結合などした後には移動させておきます。もちろん、そのままプレビューなどで開いてアプリケーションで別名で保存しても構いません。

「Quartz フィルタを PDF 書類に適用」アクションは、入力が PDF ファイルになっていますが、画像ファイルでも大丈夫。JPEG 画像はそのまま処理できました。

  • 新規 iCal イベント
    1. 新規 iCal イベント
  • イベントの要約
    1. iCal の カレンダー を検索
    2. イベントの要約
    3. 新規テキストファイル

iCal です。イベントを要約してプリントまで持っていきたいところですが、Finder の「Finder 項目をプリント」は日本語環境で使えないのでした。文字化けが起きます。きっと、シェルの lpr を使っているのでしょう。ですので、ファイルに保存するだけです。次は、Mail。

  • ファイルをアーカイブして送信
    1. 選択された Finder 項目を取得
    2. アーカイブを作成
    3. 新規メールメッセージ
    4. 送信メッセージを送信
  • スクリーンキャプチャを送信
    1. スクリーンショットを撮る
    2. 新規メールメッセージ
    3. 送信メッセージを送信
  • グリーティングカード
    1. 誕生日の人を検索
    2. 誕生日のグリーティングを送信
    3. 送信メッセージを送信

「新規メールメッセージ」アクションを実行時に表示させておく方がなにかと使い勝手はいいと思います。「スクリーンショットを撮る」アクションでは保存先を指定しておいてください。クリップボードだと添付されません。個人的にはグリーティングカードをこまめに送るような人は、仕事もできる人だと思う(偏見)。グリーティングカードを送るぐらいの手間は、得することはあっても損することはないですよね。

次は Safari。

  • テキストを読み上げる
    1. Safari の現在の Web ページを取得
    2. Web ページからテキストを取得
    3. テキストを読み上げる
  • テキストをオーディオファイル化
    1. Safari の現在の Web ページを取得
    2. Web ページからテキストを取得
    3. テキストをオーディオファイルにレンダリング
    4. オーディオファイルを読み込む
    5. プレイリストに曲を追加
    6. iPod をアップデート
  • テキストを iPod ノートとして保存
    1. Safari の現在の Web ページを取得
    2. Web ページからテキストを取得
    3. iPod のすべてのメモを削除
    4. 新規 iPod メモ

「Web ページからテキストを取得」アクションは、選択範囲などを指定できないので少し使いにくいのですが。

最後に Finder に戻って。

  • フォルダの内容をカタログ化
    1. Finder 項目の選択を求める
    2. フォルダの内容を取得
    3. 新規テキストエディット書類
  • 表示オプションを指定して新規フォルダを作成
    1. 新規フォルダ
    2. フォルダ表示を設定

Automator のアクションは、様々な項目を出力します。Finder のアクションの多くはファイルやフォルダのパスを出力します。この出力はスラッシュ区切りの UNIX パスの場合もありますし、AppleScript の Finder の参照の場合もあります。が、これらの出力は上記のようにテキストとしても扱うことが可能です。複数項目であってもパスを改行で区切って出力してくれます。

「フォルダの内容を取得」アクションでサブフォルダの内容も取得するようにしておけば、パッケージ内の項目も出力されます。ただし、結果はパスの羅列なので項目数が多いと非常に見にくいです。

「フォルダ表示を設定」アクションは、サブフォルダに変更を適用させることが出来ます。ここでは新規フォルダを指定していますが、例えば、ホームを指定して実行するとホーム以下の全てのフォルダの表示を変更することが出来ます。

さて、様々なワークフローを紹介しきました。紹介してきたワークフローは、こちらからダウンロードできます。Finder 編、iPhoto 編で紹介したものと、今回紹介したもの全てが同梱されています。いつも通りですが、ご利用はご自身の責任で。

Automator を使って楽をする - Finder 編

Automator を使って楽をしましょう。今度は真面目に。

まずは、Finder から。Finder のアクションには『選択された Finder 項目を取得』というアクションがあります。複数項目に対してなんらかの処理を行うならこのアクションが使い勝手がいいです。以下のような感じで。

  • Finder の選択項目に Spotlight コメントを追加
    1. 選択された Finder 項目を取得
    2. Finder 項目に Spotlight コメントを追加
  • 選択されているファイルを任意のアプリケーションで開く
    1. 選択された Finder 項目を取得
    2. Finder 項目にフィルタを適用
    3. Finder 項目を開く(任意のアプリケーションを指定)
  • Finder 項目の名前を変更
    1. 選択された Finder 項目を取得
    2. Finder 項目名を連番付きの名前にする
  • Finder の選択項目をプリント
    1. 選択された Finder 項目を取得
    2. Finder 項目にフィルタを適用
    3. Finder 項目をプリント

これらは、Finder のコンテクストメニューとして利用すれば便利です(Automator の「ファイル」メニューの「プラグインを別名で保存...」でプラグインの対象を Finder にして保存)。フォルダ内の全ての項目を選択し、コンテクストメニューから処理という感じ。しかし、これでは不必要なファイルも混じってしまいます。コマンドキーを押しながら一つ一つマウスで項目を選択してもいいのですが、項目が多いとうんざりします。そこで、「Finder 項目にフィルタを適用」というアクションを間に挟んで必要なファイルだけを抜き出すようにすれば、もう一つ使い勝手のいいワークフローになります。

Finder で選択してフィルタを適用してからなんらかの処理をする...こういうワークフローは上記を見ても分かるように、定型です。こういう処理が定型のものはワークフローをひな形にでもしておけばいいのですが、ここは AppleScript のサイト。やっぱり、AppleScript で解決します。以下のスクリプトを実行すると Automator を起動して新しいワークフローを作って「選択された Finder 項目を取得」、「Finder 項目にフィルタを適用」アクションを配置します。

Script Editor で開く

property workflowActions : {{"Finder", "/System/Library/Automator/Get Selected Items.action"}, {"Finder", "/System/Library/Automator/Filter Finder Items.action"}}

on run
    tell application "Automator"
        close every workflow saving no
        set theWorkflow to make new workflow

        repeat with thisAction in workflowActions
            set theAction to my getAction(item 1 of thisAction, item 2 of thisAction)
            if theAction is missing value then error "アクションが見つかりませんでした"
            tell theWorkflow
                add theAction to it
            end tell
        end repeat
        beep
    end tell
end run

on getAction(targetApplication, actionFile)
    tell application "Automator"
        set theAction to Automator actions whose file is actionFile and target application contains targetApplication
        if theAction is {} then return missing value

        return item 1 of theAction
    end tell
end getAction

上記のワークフローは Finder で選択している項目を対象にしていますが、例えば、プロジェクト関連のフォルダの中にあるファイルには同じ Spotlight タグをつけておきたいというとき。いちいち項目を選択してワークフローを実行するのは面倒です。こういうときは、ワークフローをフォルダアクションとして保存しておきます。

  • Spotlight コメントを追加(フォルダアクション用)
    1. Finder 項目に Spotlight コメントを追加

これを「プラグインを別名で保存...」で対象を「フォルダアクション」にして、目的のフォルダに添付すればいいです。フォルダに追加された項目が Automator アクションの入力になります。

必要なファイルだけを探す、ということでいえば Spotlight を使った検索アクションがそれなりに使えます。例えば、今日作成したファイルを検索し、書庫化してファイル名を実行日にする、といったアクションは以下のようになります。

  • 作成日が今日のファイルをアーカイブ
    1. Finder 項目を検索
    2. アーカイブを作成
    3. Finder 項目名に日付または時刻を追加
    4. Finder 項目名に日付または時刻を追加

アクションは、一つのワークフローに対して複数使用できます。最初の「Finder 項目名に日付または時刻を追加」アクションで日付を追加し、次の「Finder 項目名に日付または時刻を追加」で時間を追加します(こうしないと同じファイル名のものが作成されてエラーになるので)。

保存場所と検索する場所を一定にしておけば(ワークフローの作成時に指定しておく)、iCal のアラームを使ってバックアップの自動化が行えます。

ワークフローを作っていると、途中の状態を確認しながら行いたいときがあります。そういうときは「結果を表示」アクションをあいだに挟めばいいのですが、いちいち配置するのが面倒です。で、これもやっぱり AppleScript で行ってしまいます。以下のスクリプトは、最前面のワークフローのアクションの最後に「結果を表示」アクションを配置します。

Script Editor で開く

tell application "Automator"
    if not (exists front workflow) then return

    set theAction to my getAction("Automator", "/System/Library/Automator/View Results.action")
    if theAction is missing value then error "アクションが見つかりませんでした"
    tell front workflow
        add theAction to it
        --execute of it
        beep
    end tell
end tell

on getAction(targetApplication, actionFile)
    tell application "Automator"
        set theAction to Automator actions whose file is actionFile and target application contains targetApplication
        if theAction is {} then return missing value

        return item 1 of theAction
    end tell
end getAction

配置したものは取り除かないといけません。次のスクリプトは全ての「結果を表示」アクションをワークフローから取り除きます。

Script Editor で開く

tell application "Automator"
    if not (exists front workflow) then return

    tell front workflow
        set actionList to Automator actions whose target application contains "Automator" and file is "/System/Library/Automator/View Results.action"

        if actionList is not {} then
            repeat with thisAction in actionList
                remove thisAction
            end repeat
        end if
        beep
    end tell
end tell

Finder のワークフローだけで長く続きますが、Automator を使っていてちょっと不思議に思ったのが上記のワークフローでも使っている「Finder 項目にフィルタを適用」と「Finder 項目の名前を変更」アクション。

フィルタの方はフィルタの条件を複数指定できるのですが、例えば拡張子を「txt」と「text」と二つの条件を指定し「ファイル.txt」と「ファイル.text」を選択して実行しても結果が返ってこない。どちらのファイルも拡張子を指定して取得したいのにできない。いろいろ考えたあげく、これはきっと一つのファイルに対して拡張子が「txt」で「text」のものをフィルタリングしているのだろうなと当たりを付ける。つまり、以下のようなこと。

name extension of thisFile is "txt" and name extension of thisFile is "text"

てっきり、or でフィルタリングしているんだと思っていました。だから、複数の条件を指定すると思った通りの結果にならないことがある。だから、拡張子が「mp3」と「zip」のファイルを一つのワークフローで処理しようとするなら、以下のようにする必要があります。

  • 複数拡張子のファイルの一括処理の例
    1. 選択された Finder 項目を取得
    2. Finder 項目にフィルタを適用
    3. 結果を表示
    4. 選択された Finder 項目を取得
    5. Finder 項目にフィルタを適用
    6. 結果を表示

同じアクションを必要回数配置するのです。スマートじゃない。全く、スマートじゃない。やだ。といっても仕方がないようで。しかし、これは不便じゃない(他のアクションを使えばいいのかもしれませんが)?

そして、「Finder 項目の名前を変更」アクション。このアクションは、Finder ウィンドウで並んでいる順番をみて処理をしてくれるわけではないのですね。Finder ウィンドウをカラム表示していると名前順にファイルが並びますが、実行してこの並び順通りに処理されなくて焦りました。こういう順番が大事なときは「Finder 項目を並び替える」アクションを挟んで、並び替えを指定しておく方がいいようです。

  • 複数項目の並び替えの例
    1. 選択された Finder 項目を取得
    2. Finder 項目にフィルタを適用
    3. Finder 項目を並べ替える
    4. 結果を表示

デジタルカメラの画像の連番処理などは最初に撮影した項目を最初の番号にしたいはず。この並べ替えをしなかったがために撮影日順にならなかった...なんてことにならないように。

上記のワークフローは、こちらからダウンロードできます。適宜、アクションの設定を変更してご利用してください。ただし、なんらかの損害を与えたとしても当方いっさい関知いたしませんので、ご使用はご自身の責任においてお願いします。