駅前散策ブログ@かわさき HOT

今日は終戦記念日です。土に還りかけている英霊の皆さんが祖国に一柱でも多く帰還できます様に。

【RPA】【MacroDroid】非ルート端末で写真の実行年月日フォルダへの自動振り分けをしてみるよ。

2020-01-04 14:03:11 | Macrodroid&RPA関連
(´・ω・)ノ < らいなーです。

皆様明けましておめでとうございます。
本年も宜しくお願い申し上げます。





三が日も恙無く過ぎまして、平穏を謳歌している新年でございます。





さて、新年一発目は久方ぶりにMacroDroidのお話。

スマホカメラで撮影した写真のファイル名がDSCほにゃららで始まるので、これを、撮影年月日始まりのファイル名に変えられないかと思っておりましたところ、「DSC Auto Rename Pro」というアプリに出会いまして、これを利用すると、撮影した写真のファイル名を任意パターンのファイル名に出来ることがわかりました。







最初SDカードのファイル名変わらないじゃんと思っていましたが、単に設定の問題で、SDカードが保存先でもAndroid9環境でも問題なく動きました…

そこで、MacroDroidで…
・スマホ本体のストレージに写真が保存されるとき(SDカードはMacroDroidのパーミッション制限でシェルスクリプトでのアクセスが不可なので本体の場合のみにした)
・JPGもしくはjpgの拡張子のファイルが写真の格納先フォルダにあるとき
・写真の格納先フォルダ配下に日付フォルダを自動作成して、その中に、該当日付の写真(JPGもしくはjpg)を格納する
というマクロを組んでみることにしました。

成果物は以下。




ローカル変数は三つ使います。
DateYYYYMMDD
→【文字列型】年月日文字列格納用
ShellResult
→【文字列型】シェルスクリプト実行結果格納用
SnapShot_Path
→【文字列型】写真格納フォルダ指定用(固定的参照変数)

アクションは以下。

変数を設定
DateYYYYMMDD ← [year][month_digit][dayofmonth]

変数を設定
ShellResult ← 空値(変数のイニシャライズ、シェルスクリプト実行結果領域をクリア)

変数を設定
SnapShot_Path ← /storage/emulated/0/DCIM/100SHARP(スマホ【本体の】写真格納先パスを固定的に指定)

シェルスクリプト


以下のスクリプトを記述。
----
RES=`find [lv=SnapShot_Path] -maxdepth 1 -name *.JPG -or -name *.jpg 2>/dev/null`
if [ $? -ne 0 ]; then
# 予期しないエラーの場合
echo Exception
elif [ -z "$RES" ]; then
# ファイルが存在しない場合
echo No
else
# ファイルが存在する場合
echo Yes
fi
----

Qiitaの以下の記事を参考にさせていただきました。

ただ、単に小文字のjpgを -name オプションに指定するだけですと、拡張子が小文字のjpgファイルしか対象としないので、思考錯誤した結果、-orオプションのあとに再度-nameオプションを指定することで、大文字、小文字の拡張子両方に対応することができました。

これで、対象の(SnapShot_Pathに指定した)写真フォルダにjpg、JPG拡張子のファイルがあれば、Yesがシェルスクリプト結果として帰り、無ければNoがシェルスクリプト結果として帰ります。コマンドがおかしい(例外を拾った)場合はExceptionが帰ってきます。

なお、「完了するまで次のアクションをブロック」のチェックは必ずONにしてください、これを行わないと【MacroDroidのシェルスクリプト実行は非同期で行われる】ので、シェルスクリプトの結果が反映される前に次の処理が動いて、マクロとして上手く動作しません。

ポップアップメッセージの処理は上記動作の確認用に入れているので、実装の際は飛ばして頂いてかまいません。

※-name節の部分を、{-name *jpg -or -name *.JPG}と書いても良さげと思いましたが上手くいかず。
※RES変数のクォーテーション内だから、UNIXシェルスクリプトで一般的な{jpg,JPG}という書き方は使えないよ!

条件分岐の開始


チェック結果として、写真ファイルがあるときのみ後続の動作を行わせたいため、iF条件分岐で、シェルスクリプトの実行結果がYesの場合のみとします。

さらにiF分岐内で以下の処理を記述します

シェルスクリプト
cd [lv=SnapShot_Path]
mkdir [lv=DateYYYYMMDD]


スクリプトで端末本体の写真格納フォルダへカレントフォルダを指定したあとで、mkdirコマンドを利用して実行年月日のフォルダを作成するようにしています。


シェルスクリプト
mv -f [lv=DateYYYYMMDD]*.{jpg,JPG} [lv=DateYYYYMMDD]


最後に、これもシェルスクリプトで、mvコマンドで、写真格納先フォルダの、当日日付から始まるjpgもしくはJPG拡張子のファイルを、前段のスクリプトで作成した実行年月日のフォルダに移動させます。

※DSC Auto Rename Proインストール前提の書き方なので、インストールしない場合は、たんに当日に撮影したDSC始まりのファイルを日付フォルダに移しても、【ほぼ】想定した動作に近い処理ができるはずなので、[lv=DateYYYYMMDD]の部分は外しても良いかと思います。


上記マクロをアクショントリガーで毎日23時59分に実行させることで、その日に撮影した写真を自動で振り分けすることが出来るようになりました!

ただしSDカードが絡むと、無理なんですよね…
rootを取らないとダメです。
※MacroDroidフォーラムで散々ネタにされている通り、非root端末でシェルスクリプトからSDカードに対する操作を行おうとするとパーミッションエラーになるためで、公式としてはファイル操作v2を使ってくれ、という話があるためです。
※いうてもファイル操作v2ってさ、動的フォルダ指定に対応してないやん(ベータ含めて)?なんとかしてほしい仕様ではあります。

以上です。
ここまでお読みくださりありがとうございました。




以下蛇足。

新年一発目のらーめんは、川崎駅ビル「アトレ」地下のアトレで油そば食べましたー。美味しかったです!


Tile Mateが初売りで川崎ラゾーナのビックカメラで1000円で売られております。これ、地味に便利ですね。二個購入して忘れ物防止タグデビューしましたよ!





この記事についてブログを書く
« スマホで使うUSBメモリはサン... | トップ | 公開方法変更のお知らせ »