vi コマンドを使って自分だけのコマンドをつくる Part.3
前回:Part.2
前回挙げた課題を解決するため「ren-png」と「mvpng」を改良し、さらに2つをドッキングさせたコマンド「mvss」を作ります。
解決したい課題
ren-png では…
- スクショのデフォルト名が「スクリーンショット yyyy-mm-dd hh.mm.ss.png」という半角スペースを含んだ名前なので、ls を使って配列にぶちこむと3分割されてしまう
- スクリーンショット以外のPNGファイルも移動されてしまう。
mvpng では…
- 移動先ディレクトリも任意の名前で作成したい。
ren-png の改良
「一括リネーム シェルスクリプト」でググって先人の知恵をお借りしたところ、
for 文を使うことで解決しました。
お試し用として「rentest」という名前のコマンドを作って実行してみます。
中身は以下。
for filename in スクリーンショット*
do
echo ${filename}
done
これを、スクリーンショットが置いてあるDesktopで実行してみると…
$ cd ~/Desktop
$ rentest
スクリーンショット 2014-09-11 15.21.22.png
スクリーンショット 2014-09-11 15.21.23.png
スクリーンショット 2014-09-11 15.21.24.png
filename という変数に「スクリーンショット」から始まるファイル名が格納されているのがわかります。
これを応用して Part.2 で作った「ren-png」を下記のとおり書き直しました。
newfile=$@
k=1
for filename in スクリーンショット*
do
change="${newfile}-${k}.png"
mv "${filename}" "${change}"
k=`expr $k + 1`
done
前回と同じく
$ ren-png hogehoge
というふうに実行すると、
前回はディレクトリ内のすべてのファイルが対象でしたが、
今回は「スクリーンショット」から始まる名前のファイルのみが
hogehoge-1.png hogehoge-2.png hogehoge-3.png …という具合に一括リネームされます。
あっさりしすぎて悲しいくらいです。
参考
- シェルスクリプトで複数ファイルを一括リネームする方法
- [http://tm.root-n.com/unix:general:rename::title=Unix :: ファイル名の一括リネームいろいろ](http://tm.root-n.com/unix:general:rename::title=Unix :: ファイル名の一括リネームいろいろ)
mvpng の改良
「ren-png」と同様、引数を変数に格納することで解決します。
Part.1 で作った「mvpng」に下記の通り手を加えました。
newdir=$@
mkdir ~/Desktop/${newdir}
mv ~/Desktop/*.png ~/Desktop/${newdir}
これを
$ mvpng piyopiyo
というふうに引数を与えて実行すると、
「piyopiyo」というディレクトリがデスクトップに現れ、
デスクトップ上の PNG ファイルがその中に移動されます。
ren-png と mvpng を合体させる
最終目標である移動とリネームの一括操作ができるコマンド、
名づけて「ssmv」を作りました。
ren-png と mvpng で引数を変数に格納するときには $@ という書き方をしましたが、
$1 $2 $3 … $n というふうに指定すれば、
n 個目の引数を任意の変数に格納できます。
その点を踏まえて書いたのが以下。
#引数の格納
newfile=$1
newdir=$2
#スクリーンショットから始まるファイルをリネームする
k=1
for filename in スクリーンショット*
do
change="${newfile}-${k}.png"
mv "${filename}" "${change}"
k=`expr $k + 1`
done
#ディレクトリを作成し、画像を移動する
mkdir ${newdir}
mv ${newfile}*.png ${newdir}
これを、スクリーンショットが散乱したデスクトップで
$ ssmv screenshot images
といったぐあいに実行すると、
screenshot-1.png screenshot-2.png screenshot-2.png …とリネームされ、
images というディレクトリに移動されます。
最後の課題
今のままだと引数を指定し忘れたり、該当するファイルが無かったりしても問答無用で実行されるので、より安全にするための条件付けをする。
続き→Part.4