シェルスクリプトでAndroidの写真の自動バックアップをした話
こんにちは!
今回は、前回紹介した「Termux」を利用して、Androidスマホの写真の自動バックアップ機能+αを行った話をしたいと思います。AndroidをLinux的に扱うことの出来るアプリ「Termux」については前回の記事をご覧下さい。
開発のモチベーション
今回実装したプログラムは、Androidスマホで撮った写真のファイル名変更とバックアップを行うものです。単純に、写真のバックアップをとっておきたいという意図はわかりやすいとは思いますが、個人的にはどちらかというとファイル名の変更を行うのがむしろメインの機能だと思っていますw
どういうことかと言うと、Android純正のカメラアプリの仕様上、写真のファイル名の命名規則があまりにも扱いにくいので、その改善が今回の開発の主なモチベーションだということです(この命名規則は機種によっても変わるかも知れません)。僕もそこまで詳しく調べたわけではないですが、おそらく純正カメラアプリの命名規則は、「DCS_xxxx.JPG」となっており、xxxxには適宜番号がつくようなものになっているのだと思います。
この何が問題かというと、番号の付け方がとてもひどいということです。というのは、0001から順番に番号が振られていくわけですが、その時点でのカメラフォルダのファイルの存在有無を確認し、できるだけ若い番号をつけるというアルゴリズムになっているのです(多分)。つまり、ファイルを削除したりすると、その抜けた番号が優先的に埋まっていくため、ファイル名と時系列がまったく整合しないのです。
具体的に例をだすと、DCS_0001、DCS_0002、DCS_0003という写真がある状況で0002の画像を消した場合、次に撮った写真の名前としては0002の番号が振られます。そのため、時系列の順番としてはDCS_0001、DCS_0003、DCS_0002になるという、管理上とても扱いにくいことになってしまうというわけですw
実際にスマホで撮った写真をそこまで厳密に管理する気があるわけではないですが、これではあまりにもあんまりですw ということで、このファイル名を「Termux」を使ってなんとかしようというのが今回の開発のモチベーションです。具体的には写真のファイル名を撮影日時に自動的に振り直す、というのが今回のプログラムの主な機能となります。バックアップについては、そのついでみたいなものですねw
「Termux」でのシェルスクリプト動作テスト
実際に写真を扱う前に、まずは簡単にシェルスクリプトの動作をテストします。「Termux」でシェルスクリプトが正常に動作するかどうかがよくわからなかったので、念の為に確認した感じですね。ネットでTermuxの利用例なんかはちょくちょく見るのですが、sshとかプログラム開発などがほとんどで、シンプルにシェルスクリプトを使っている例があまりなかったんですね。
ということで、まずはテキストエディタをインストールするために
$ pkg install vim
としてvimをインストール。無事にインストールが完了し、少しいじった限りではLinuxと同じように使えそうな感じです。あとは適当にテストコードを組みます。
$ touch test.sh # スクリプトファイル作成
$ vim test.sh # スクリプトの編集
として
ってな感じで簡単なスクリプトを書いて
$ chmod 777 test.sh # 実行権限を付与
$ ./test.sh #実行
として
「hello world」の表示を確認。普通にシェルスクリプトも動くようですね。
シェルスクリプトでの写真のバックアップ+α
Termux上でシェルスクリプトが通常に動くことが確認できたので、目的のコードを書いていきます。具体的には、ファイル名を変更するスクリプトとサーバーにファイルのバックアップを送信するスクリプトです。
と、その前に、Termuxから画像フォルダにアクセスできるように下記コマンドを入力。
$ termux-setup-storage
このコマンドを打つと、Termuxから画像フォルダやダウンロードフォルダなどにアクセスできるようになります(このコマンドを打ったタイミングで許可を求める画面が表示されるので、許可をしておきます)。
こんな感じで各種フォルダにアクセス可能になるので、ここから写真のファイル名の変更とファイルコピーを行います。Linuxに多少慣れている方なら、ここまでくればあとはお手の物でしょう。
こちらがファイル名変更のためのスクリプト。シンプルに、各ファイルでループを回して、ファイルの生成日時を取得してファイル名として設定するような感じですね。
次にrsyncを使ってファイルのバックアップを取るスクリプトを組んでいます。必要なパッケージは下記にてインストール。
pkg install nmap
pkg install rsync
そして、スクリプトの内容はこちら
処理の流れとしては、nmapで自宅サーバーと接続しているかどうかを確認し、接続できていれば写真フォルダ(ついでにスクリーンショットフォルダも)ごと共有フォルダに(ssh経由で)放り込みます。rsyncで増分アップロードを行う仕様になっているで、初回だけはそこそこ時間かかりますが、二回目以降はそんなに時間もかからずバックアップをとることができます。
Cronの設定
あとは、自分の手を煩わせること無く自動でのファイル名変更 & バックアップが出来るように設定します。具体的には「Cron」を使って毎日夜に上記のスクリプトを自動実行するようにします。
$ pkg install cronie
Termux上では「cronie」というパッケージ名のようですが、基本的に使い方はLinuxのcronとほぼ同じようです。Termuxはシングルユーザーなので、実行権限周りが比較的シンプルといった違い程度ですかね。
$ crontab -e
として「crontab」を以下のように編集。
0 0 * * * ~/bin/photo_rename.sh;~/bin/photo_backup.sh
そしてcronの実行
$ crond
これで毎日深夜24時に勝手にスクリプトが実行されて、写真のファイル名変更とバックアップをやってくれます。素晴らしい。
と、ここまでで自動で写真ファイルの処理をしてくれる環境ができたわけですが、実はこれにはちょっと問題があります。というのは、Termuxのセッションが切れるごとに「crond」を立ち上げなければならず、Termuxがバックグラウンドで動いてくれていないと自動実行されないことです。もちろん、毎日夜にTermuxを開いてcrondを叩けば良いのですが、それだと自動化としてはちょっと物足りないですね。
というわけで、課題が残ってしまったわけですが、そのあたりの課題解決は次回に書いていくつもりです。
おまけのスクリプト
Termux側でやることを上記で書いたわけですが、実はサーバー側でこのあとに更に少し処理を行っているので、そちらの紹介もしておきます。何をしているかというと、スマホで撮影した写真のサイズ縮小版の作成です。というのは、最近のスマホはカメラの性能がやたら良く、そのまま生データとして使うとサイズが大きすぎて使いにくいので、縮小版を自動で生成できると便利かなと(もちろん生データはそれはそれで保存はしておきます)。noteにアップロードするなどが僕の写真の主な使用用途なので、あまり高い画質は必要ないですからね。
#!/bin/bash
FOLDER_PATH="/mnt/storage/data/photo_bu"
FOLDER_ORIGIN="100ANDRO"
FOLDER_RESIZE="100ANDRO_compress"
if [ ! -d "${FOLDER_PATH}/${FOLDER_RESIZE}" ];then
mkdir "${FOLDER_PATH}/${FOLDER_RESIZE}"
chmod 777 "${FOLDER_PATH}/${FOLDER_RESIZE}"
fi
find $FOLDER_PATH/$FOLDER_ORIGIN -name '*.JPG' | while read file
do
file_name=`basename "$file"`
echo $file_name
file_origin="${FOLDER_PATH}/${FOLDER_ORIGIN}/${file_name}"
file_resize="${FOLDER_PATH}/${FOLDER_RESIZE}/${file_name}"
if [ ! -f "$file_resize" ]; then
convert -resize 30% "$file_origin" "$file_resize"
fi
done
ごちゃごちゃと処理を書いていますが、画像の縮小自体は最終行の「convert -resize 30% "$file_origin" "$file_resize"」のみです。LinuxのImageMagickというライブラリの「convert」コマンドを使って画像縮小している形です。
このスクリプトを毎日夜中の午前1時に実行することで、スマホから適宜アップデートされるバックアップファイルの縮小版を自動的に作成してくれます。こちらのcronはサーバーマシン上で動いているので、特に問題はありません。
まとめ
ということで、今回は「Termux」を使ってスマホの写真のファイル名を変えたり、自動バックアップを取るスクリプトを紹介しました。cronの問題はあるものの、Termuxのユースケースとしては比較的実用的な部類かなとは思います。
次回はこのcronの問題を解決するために、ある有名なAndroidアプリを紹介する予定です。Termuxとの連携以外にも出来ることはいろいろあるので、それらも含めて書いていければなと思っています。
それでは、また!