bashでShellScript
実は、まだ書いたことがなかった。
BACKBLAZEのB2 Cloud Storageにアーカイブを上げるのにwebだと容量制限にひっかかることが多くて。1ファイルあたり300MB〜500MBくらいかなー、正確には知らないけど。だいたい1GB超えるファイルをごりごりあげるんで、公式のCommand Line Toolでいちいちコマンド打ってたり。
ところが、アップデートしたら動かなくなっちゃって。アンインストールしてからの再インストールもダメでなんだかパーミッションの問題っぽい。Python(pip)のインストールからしてwarning出てるし、もはやこれまでか的な。頑張れば修復できるんだろうけどねー、プラットフォームからどうにかするより代替手段にしたほうがお手軽だろうと安直に走った。
アーカイブはディスクイメージファイルにしているんで、とりあえずでhdiutilでwebからアップロードできるサイズに分割して対処したらまあ気が楽なこと。それならいっそ、いちいちコマンド打ち込む煩わしさから解放されちゃるって思いからシェルスクリプトに書くことにした。
シェルスクリプトなんてMS-DOS 5.0のCOMMAND.COM以来なんで自信がないわねー。今時のシェルスクリプトに比べれば機能が低かった分、命令も僅かなんで単純なものしか組んだことないもの。MSX-DOSも、Human68kも、まあ似たような程度で。
Automatorでやってみようとも思ったけどターゲットのpathやらfilenameやら分解させるだけで面倒に感じて即座に投げ出した。AppleScriptでもやっときゃ良かったんだろうけどね。あ、今ならJavaScriptで書いてもAppleScriptとして動作するんだっけ?
で、bashである。
CUIならGUI、GUIならGUIで完結するのがベターな主義者(言い訳)としては、MacOSでわざわざ「メイン」の用途でunix/BSDのコマンドなんざ使わないものねえ。主義には反するけどやるからにはちゃんと動かそうと思って、入門みたいなサイトをちらっと読んでみたら頭がパニック、なにこの高機能。
hdiutilのほうもmanしてもちんぷんかんぷんなのでwebで解説をチラ見。まあ、なんとかなるでしょう!!ってことで拙いながらもちゃんと動くものが一発でできた。なんだー、調べたり確かめたりしながら2〜3時間も格闘したけどどーにかなるもんやね。
#!/bin/sh
echo "========================================"
echo "保管用の書庫作成"
echo "========================================"
## 初期値
dPath="/Users/dicek/Desktop"
## 入力判定
while getopts e OPT
do
case $OPT in
"e" ) enCrypt="TRUE";
echo "暗号化 : オプションが選択されました";;
esac
done
shift `expr $OPTIND - 1`
if [ $# -lt 1 ]
then
echo "書庫化する対象を入力しやがれ"
read input
else
input=$1
fi
sPath=${input%/*}
dName=${input##*/}
echo "対象フォルダ : ${sPath}"
echo "出力先 : ${dPath}"
echo "書類名 : ${dName}"
echo "========================================"
## テンポラリの作成
echo "[書庫化]"
hdiutil create -puppetstrings -srcfolder "$sPath"/"$dName" "$dPath"/"temp.dmg"
echo "----------------"
## テンポラリをコピー...名前の変更と必要なら分割(と暗号化)
echo "[まとめ]"
if [ "$enCrypt" == "TRUE" ]
then
printf 'hoge' | hdiutil segment -o "$dPath"/"$dName" -segmentSize 256m -encryption AES-256 -stdinpass "$dPath"/"temp.dmg" -puppetstrings
else
hdiutil segment -o "$dPath"/"$dName" -segmentSize 256m "$dPath"/"temp.dmg" -puppetstrings
fi
## テンポラリの削除
rm "$dPath"/"temp.dmg"
もっとスマートなやり方は有るはずだけど、もう少し勉強してからな。オプションは暗号化の-eだけなんでループしなくても良いんだろうけど、なんか増やしたくなりそうだったのでこうしてみた。
shiftとか便利なモンあるんだねえ、MS-DOS 5.xの頃には無かったよねえ? 条件分岐くらいはあった気もするけど、ループとかあったかなあ? パスとファイル名の抽出は正規表現よね、これもちゃんと覚えたいと口では言ってきてたけど未だにさっぱり。
ちなみにB2 Cloud StorageではPython以外にはSwiftもサポートしているみたい。Swiftかあ、iOSのアプリってどうなん?と思いながらちょっと手を出して引っ込めたままだね。
我は無能なり。
勉強が足りぬわい。