Skyland Ventures tech ブログ

渋谷のVenture Capital Skyland Venturesのいま一番イケてる投資先、nanameue,IncとKaumoの共同技術ブログ

複数ファイルの一括リネーム!! ~エンジニアインターン生がターミナルで遊んでみる~

nanameue, Inc. でインターンしています 横田です。

いきなりですがパソコンでファイルをいじっているときのこういうことになったことありませんか?

  • アプリで画像ファイルを書きだした時に全部のファイルに不必要な接頭・接尾語がついてしまった
  • すべてのソースファイルの接頭語を変更しなければいけない

ファイル名を変更するのにそのファイルを一回、一回、手で選んで名前を変更するハメに…. ファイルの数が2,3個ならいいんですが、もし名前を変更しなければいけないファイルの数が100個もあったらもう大変。これだけで名前を変更するという繰り返しの作業で2時間くらいつぶれてしまいます。

ん? 繰り返し?

同じことの繰り返しを見つけた時には、コンピューターにやらせなければダメです! 人間様のやることではありません。

では実際のケースでやってみましょう。

実際にやってみた

f:id:skytechblog:20151209023713p:plain

BBというプロジェクトを開始するにあたって、AAというプロジェクトのソースコードを元にしてはじめようとしているとしましょう。Objective-cではファイルの前に2~3文字のアルファベットをつけるのが定例なのですが

 AAViewController -> BBViewController

に変えたい! それを叶えるためにターミナルでBBディレクトリまでいってこのコマンドを叩きましょう!

for i in ./AA*;do mv -- "$i" "${i/AA/BB}";done

解説

まず for から見てみましょう for は プログラミングを勉強するとおなじみですが、なんとターミナル上でも使えるんです。 for の使い方としては

for i in リスト ;do コマンド(処理) ;done

となるのですが,これはシェルスクリプトにおける

for i in リスト
do
     コマンド
done

と同じです。こっちの方がわかりやすいですね。

for i in ./AA* はカーレントディレクトリでAAで始まるファイルのに対して for 文 を回すという意味になるのですが、少しわかりづらいですね。具体例を上げると

for i in a b c

これは a , b, c というファイルに対して繰り返します。

ここで元にもどって

./AA*

*は正規表現で任意の0文字以上の繰り返しなので,カレントディレクトリのAAで始まるすべてのファイルを差します。

つぎに処理内容を見ていきましょう

mv — “$i”, “${i/AA/BB}"

mvはターミナルではリネーム/ファイルの移動を行うコマンドで、

mv A B

で Aというファイル名をBというファイル名に変更します。

mv の後ろ — は mv コマンドのオプションの1種でAをBにリネームした際にすでにBという名前のファイルが存在した場合、バックアップをとるので念のためつけましょう。

次に

“$i” , “${i/AA/BB}"

”$i” は リストの i番目の値を意味して,”${i/AA/BB}”はリストの i番目の値の中のAAという文字列を検索してBBで置換した値になります。

具体例として先程の写真のファイルにおいて i = 0 の時について考えると

“$i” = AAViewController.h “${i/AA/BB}” = BBViewController.h

となり

mv — AAViewController.h BBViewController.h

上のコマンドが実行されてリネームされます。そしてこの処理をforでループさせて、すべてのAAとい文字を頭に持ったファイルに行ってきます。

一番最初にしめしたコマンドを打ちますと

f:id:skytechblog:20151209023746p:plain

となります。

まとめ

エンジニアをやっているときに大切なのは”繰り返し”をみつけたら、それをうまく一般化してコンピューターにやらせる事です。今回はそれをターミナルで実現してみました。

この記事に少しでも興味をみてくれたら nanameueへ!!