vi コマンドを使って自分だけのコマンドをつくる Part.3

Mac

前回: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 …という具合に一括リネームされます。
あっさりしすぎて悲しいくらいです。

参考

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

Comments

  • スパム対策のため、コメント本文にURLが含まれている場合は「承認待ち」となり、すぐに投稿が反映されません。ご了承ください。
  • 公序良俗に反する内容、個人が特定できる情報、スパム投稿と思われるコメント等については、予告なく編集・削除する場合があります。