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. 結果を表示

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

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

0 件のコメント :

コメントを投稿