Automatorのフォルダアクションを使った小技.ファイル自動振り分けとファイルの自動アップロード

公開日:2014/07/03 更新日:2014/07/03
Automatorのフォルダアクションを使った小技.ファイル自動振り分けとファイルの自動アップロードのサムネイル

Automatorとは

Mac OS Xでは、Automatorという便利なアプリが標準で使用できます。このAutomatorで何ができるかというと、Automatorを使うことで色々な作業を自動化することができます。これではあまり意味がわからないと思いますが、以下のサイトを見るとAutomatorでどういうことができるのかがわかると思います。とても参考になりました。

Automator の使い方 | All About Macの”Automator”の便利さは異常 | romper room

Automatorでフォルダアクションを作成

フォルダアクションとは、フォルダへのファイル追加をトリガとして行うアクションのことです。つまり、こちらで指定したフォルダにファイルが追加された時に指定した処理を行わせることができます。Automatorでこのフォルダアクションを作成することができます。そして以降にはこのフォルダアクションを利用した以下の2つの小技をメモします。

  • ダウンロードしたファイルを拡張子で自動振り分け
  • レンタルサーバにファイルを自動アップロード

ダウンロードしたファイルを拡張子で自動振分け

ブラウザでダウンロードしたファイルは、デフォルトだと「Downloads」フォルダに保存されると思いますが、私の場合はこのDownloadsフォルダが整理されておらずぐちゃぐちゃでした。そこで、最低でもファイルの種別、拡張子毎にフォルダ分けしたいと思い、フォルダアクションを利用することにしました。

以下の手順で作成するフォルダアクションは、指定したフォルダにファイルが追加されたら、そのファイルの拡張子に基いてファイルをフォルダに振り分けます。なお、振り分け先となるフォルダは、拡張子そのものが名前であるフォルダになります。例えばjpgファイルならば、jpgフォルダに振り分けられます。jpgフォルダが存在していない場合は、まずjpgフォルダを作成してから振り分けます。

フォルダアクションを作成する

まずAutomatorを起動します。Automatorは「アプリケーション」フォルダ内にあります。起動すると、以下のような画面が表示されます。フォルダアクションを作成するので、以下の画面では「フォルダアクション」を選択した状態で、画面右下の「選択」をクリックします。

automator_start_fa_resized.jpg

すると以下のような画面になるので、赤線枠で囲われた部分から、自動振り分けを適用したいフォルダを選択します。ここで選択したフォルダにファイルが追加された時に、追加されたファイルのリストをフォルダアクションが受け取れるようになります。ここでは、Downloadsフォルダを選択することにします。

chose_folder_resized.jpg

フォルダを選択したら、次は赤線枠の検索ボックスに「シェル」と入力し、検索結果に出てきた「シェルスクリプトを実行」をドラッグ&ドロップで右側の領域に持っていきます。

shell_drag_drop_resized.jpg

あとはシェルの種類と入力の引き渡し方法を選択します。シェルの種類はデフォルトの「/bin/bash」で良いと思います。入力の引き渡し方法は「引数として」を選択してください。

exec_shellscript_resized.jpg

最後に、以下の赤線枠内のコードを全て削除して、代わりにファイルを自動振り分けするための以下のシェルスクリプトを貼り付けます。

shellscript_inert_resized.jpg

以下が自動振り分けのためのシェルスクリプトになります。

IFS=$'\n'

for f in "$@"
do

fpath=${f%/*} #ファイルのパスを取得
ext=${f##*.} #ファイルの拡張子を取得

if [ ! $ext = "app" -a ! -d $f ]; then

    if [ ! -e $fpath/$ext -o ! -d $fpath/$ext ]; then
        mkdir $fpath/$ext
    fi  
        mv $f $fpath/$ext
fi

done

なお、上記のスクリプトでは、私の都合のために、拡張子が「app」であるファイル、すなわちアプリケーションファイルに対しては何もしないようになっています。以降に上記のシェルスクリプトの簡単な説明を載せます。なお、多くのサイトに載って情報を参考にさせて頂きました。ありがとうございました。

1行目:改行文字の指定

スペースが含まれるファイル名を扱うために、1行の区切り文字を改行文字に指定しています。

スペースが含まれる文字列を1行として扱う方法 | 逆引きシェルスクリプト

3〜17行目:配列を使ったfor文

配列を使ったfor文を使っています。配列「$@」にフォルダに追加されたファイル名が格納され、格納された各要素、すなわち各ファイル名を「f」という変数に格納して処理しています。

for文 | SWEng Tips

6,7行目:ファイルのパスと拡張子を取得

シェルスクリプトでパス文字列からファイル名/ディレクトリ名/拡張子を抽出する

9行目

フォルダに追加されたファイルの拡張子が「app」 でない、かつフォルダではないことを条件としています。「-a」はAND、「-d」はディレクトリであるかどうかの判定に使います。

if文の条件式でand, or, notを使う方法 | 逆引シェルスクリプト ファイルやディレクトリの存在をチェックする方法 | SWEng Tips

11〜14行目

フォルダに追加されたファイルの拡張子と同じ名前のフォルダがなければ作成し、同じ拡張子の名前がついたフォルダへファイルを移動しています。

上記のスクリプトをそのまま上の画像の赤線枠に貼り付けたら、後は以下のように適当な名前をつけて保存すればフォルダアクションの作成は完了です。ここでは「testaction」という名前にしました。次は作成したフォルダアクションを自動振り分けを適用するフォルダに関連付けます。

save_action_resized.jpg

特定のフォルダにフォルダアクションを関連付ける

フォルダアクションを作成したら、そのフォルダアクションを適用するフォルダに関連付ける必要があります。そのためには、以下のようにフォルダアクションを適用したいフォルダ上で右クリックし、以下のように「サービス」→「フォルダアクション設定」を選択します。なお、ここの「フォルダアクション設定」という項目は、フォルダのエイリアス上で右クリックしても出てこないので注意して下さい。

folderaction.png

関連付けることができるフォルダアクションがリスト表示されるので、この中から作成したフォルダアクションを選択します。ここでは、上記で作成した「testaction.workflow」を選択しています。なお「.workflow」は自動的に付加されたものです。

chose_action.jpg

関連付けが完了すると、以下の画面になり、フォルダとフォルダアクションの対応が見れます。

confirm_action.png

以上でフォルダアクションの関連付けは完了です。試しに、関連付けたフォルダに適当なファイルをコピーして動作を確認してみて下さい。

なお、上記では自動振り分け用のシェルスクリプトを使用しましたが、当然ながらこのシェルスクリプトを変更することで、いろいろなフォルダアクションが可能になります。1つの例として、フォルダにファイルが追加されたら、そのファイルをレンタルサーバ上のフォルダに自動アップロードするというフォルダアクションを作成したので、以降に載せます。

レンタルサーバに自動アップロード

上記の自動振り分けの時に貼り付けたシェルスクリプトを以下のものに変更するだけで、フォルダに追加されたファイルを自動でレンタルサーバのフォルダにアップロードすることができます。なお、以下のシェルスクリプトはrsyncとsshの鍵認証を使っています。これらについて不明な方はこちらのrsyncの記事が参考になるかもしれません。

USER=username #ユーザ名
PASS=password #パスワード
HOST=hogehoge.jp #ホスト名
PORT=22
KEY=/Users/user/.ssh/user.key

SOURCEDIR=/Users/user/sync_folder
DESTDIR=/home/username/sync_remote
OPTION="-av --delete"

expect -c "
set timeout 10
spawn rsync -e \"ssh -i $KEY -p $PORT\" $OPTION $SOURCEDIR $USER@$HOST:$DESTDIR
   
    expect \"Are you sure you want to continue connecting (yes/no)?\" {
      send \"yes\n\"
      expect \"Enter passphrase for key '$KEY':\"
      send \"$PASS\n\"
    } \"Enter passphrase for key '$KEY':\" {
      send \"$PASS\n\"
    }
    interact
    "

見てわかる通り、単純にシェルコマンドのrsyncを実行しているだけです。このシェルスクリプトを含むフォルダアクションが関連付けられたフォルダ(sync_folder)にファイルが追加されたら、シェルスクリプト内に記述されたレンタルサーバのフォルダ(sync_remote)にもファイルが自動でアップロードされます。なお、sync_folderのファイルが削除されても、即座にsync_remote内の同じファイルも削除されるわけではありません。フォルダアクションはファイルが追加された時に動作するので、ファイルが追加された時にsync_folderとsync_remoteがrsyncによって同期し、sync_folderに存在しないファイルはsync_remoteからも削除されます。

まとめ

これまでAutomatorというものを使ったことがありませんでしたが、いろいろと便利なことができそうです。今回メモしたのは単純にシェルスクリプトを実行しているものだけですが、シェルスクリプトを実行できれば、ファイル追加をトリガとしてrubyやperlなどで作成したプログラムも動かすことができます。まだまだ色々なことができそうです。他にもAutomatorの便利な使い方があればせひ教えてほしいです。

関連記事

関連記事はまだありません。

開発アプリ

nanolog.app

毎日の小さな出来事をなんでも記録して、ログとして残すためのライフログアプリです。