プログラミングエッセイ〜Shellスクリプトとの戦い〜
前回に引き続き、火炎現場の洗礼を受けた時の話から始めます。
前回の話で自分が(身にしみて)学習したものは以下の通りです。
前回学習したもの
- 目的を明確にする
- 目的を実現するまでの手順を一覧にする
- 手作業で行う場合の実行手順を確認
- 確認した手順をプログラムで再現する
- 作成したプログラムをテストする
- あとは何回でも同じ作業はダブルクリックで行うことができる
これはプログラムを作るときだけでなく、作業にも共通することです。例えば。。。
引っ越し作業をする場合
正直のところわざわざ明確にするまでもないようなことですが、意識してやると作業効率が全然違います。
- 目的を明確にする:荷物を梱包→運び出しトラックに積む→引っ越し先に運び出し→指定された位置にものを配置する
- 目的の作業手順を明確にする:荷物の梱包→食器、家電などをそれぞれの品物を入れるための段ボールなどの個数を大まかに見積もるetc...
- 手作業で行う場合の実行手順を確認:実際に引っ越しを行う作業フローをシュミレートしてみる。
- 確認した手順をプログラムで再現する:実際に現場でその通りに動いてみる
- 作成したプログラムをテストする:作業中にやって見てうまくいくいかないを判断して、その場で方法を改善していく
- あとは何回でも同じ作業はダブルクリックで行うことができる:出来上がった作業方法を次の現場でも同じようにやる
最終的にはこのやり方が作業をする人の「やり方」になり、いわゆるノウハウになります。
Shellスクリプト
引っ越し作業の方がわかっている自分としては、実際にプログラムで上のようなやり方をプログラムに落とし込むのには時間がかかりました。
火炎現場だったので、日数はそれほどでもありませんが費やした時間はマァマァなものでした。
当時の自分にとてもしっくりきたのが「Shellスクリプト」です。
具体的には、引っ越し作業の作業手順を例に記載したいと思います。
引っ越しの場合はやることが同じです。実際には現場の環境(マンションや一軒家、家族なのか一人なのか?。。。)パターンは客によるので、ほぼ無限にあります。
しかし行うことは上に記載したようにパターン化できます。
Shellスクリプトで行うときも同様に考えます。
例えば。。。
Shellでの自動化
パソコンを立ち上げて作業を開始しようとしたときには、使用するアプリが決まっていることが多いと思います。なので「パソコンを起動したら特定のアプリを起動する」ということをShellスクリプトなどで行えると楽(作業効率化)ができます。
実際にはWindowsで作業を行うことが多いと思うのでWindowsならば「スタートアップフォルダ」にアプリのショートカットを配置してやればパソコンを立ち上げたときに対象のアプリを起動できます。
じゃShellで何やるの?
上に挙げたようなことも実際にはWindowsのスクリプト(多分コマンドプロンプトで使うバッチ)が起動するようになっていると思うのですが。Shellも同様なことができます。
というかWindowsのコマンドプロンプトもShellも言葉が違うだけでやれることはほぼ同じです。(WinとMac, Linuxで微妙に挙動が違いますが。。。)
そんなときに考えるのは上にあることを考えます。
単純な作業でもとても面倒な作業としてファイル名の変更などがあると思います。
それをプログラムにやらせると早く終わります。
写真のファイル名を日付順に名前を変更する
実際には大した量がありませんが、3ファイルのファイル名を変更しようとしたとき

日付順にファイル名を変更するために、必要な作業は下のようになります。
- 日付を取得する
- ファイル名を変更する
以上です。そしてこれをプログラムにやらせようとすると以下のようなスクリプトになります。
Shellスクリプトon Mac
余談ですが、MacはUNIX系のOSなのでShellが使用できます。Linuxとほぼ同じですのでLinuxでも使用できるコードになると思います。がMacでのShellはちょっとクセがありそうです。ちょっとコーディングしてみたら結構違いました。。。
ちょうどこんな感じで、やることを明確にして処理を書き出し、プログラムを作成
今しがた作成にかかった時間は、だいたい30分くらいなので20件以上のファイル名を変更しようとしたときにはプログラムでやった方が早いことになります。
ちなみに、ファイル名を変更したらそれが正しいことを確認する必要もあるので作成したファイルを「ls」コマンドで一覧して確認します。※今回は確認処理を入れていません。コマンドでテキストか何かに出力すればすぐに確認できると思います。(エクセル関数が使用できます)
<Shellスクリプトのコード>
#!bin/sh
for file in $(ls); do
newFileName=$(date -r $file)
echo $newFileName
$(mv -f "$file" "$newFileName")
done
実行前

実行後

実行した後に「test.sh」までファイル名が変わってしまいました。
そのように書いたのだからそーなるか。。。
でわでわ。。。