例えば以下のようなディレクトリ構成があって
$ tree
├── android
│ └── resource
│ └── images
│ └── webview
└── iphone
└── resource
└── images
└── webview
今、 android/resource/images/webview にいて、
androidの作業が終わったからiphoneの方の resource/images/webview ディレクトリに移動したい、
という場合に効率的に移動できる方法を考えてみました。
パターン1: ../ って打ちまくる
$ pwd
/pass/to/some/directory/android/resource/images/webview
$ cd ../../../../iphone/resource/images/webview
$ pwd
/pass/to/some/directory/iphone/resource/images/webview
・・・あまりイケてないですね。。。
まだ4階層くらいならタイプする気にもなりますが、深くなればなるほど何回 ../ って打たなきゃいけないのかよく分からなくなり、非効率です。
パターン2: pwd と sed を使う
$ pwd
/pass/to/some/directory/android/resource/images/webview
$ cd `pwd | sed -e "s/android/iphone/g"`
$ pwd
/pass/to/some/directory/iphone/resource/images/webview
ちょっと楽になりました。これなら階層に関係なく簡単に移動ができます。
が、いちいち コーテーションやパイプ等の記号をタイプするのが面倒です。もう少し楽にしたいところです。
パターン3: bashrc に関数を登録する。
今回の本題です。パターン2で作ったコマンドを、関数登録することでさらに使いやすくします。
function cdsed() {
cd `pwd | sed -e "s/$1/$2/g"`
}
$ source ~/.bashrc
$ pwd
/pass/to/some/directory/android/resource/images/webview
$ cdsed android iphone
$ pwd
/pass/to/some/directory/iphone/resource/images/webview
だいぶ楽になりました!
これなら変更したい文字列をタイプするだけで済みますね。
まとめ
ちょっとしたことではありますが、マルチプラットフォームのサービスを開発・運用していると、プラットフォームでディレクトリが区切られていて、さらにその下の深い階層で作業して、戻って別のプラットフォームの同じディレクトリで同じ作業して、ということが少なからずあったりします。
そんなときに、なんとか ../ をタイプしまくらなくて良い方法はないかな、と思って考えついたのが上記の工夫です。
「こんなことしなくてももっと良い方法があるよ!」という情報がありましたら、コメントいただけるととても嬉しいです!
ちなみに、上記のコマンドはパスの中に変換したい文字列が2回以上出てくると全て置換してしまいます。
あまりそのようなパターンに出会ったことがなく、両方置換してしまうのが良いのか、何番目を置換する、みたいに選択できた方が良いのか判断つかなかったので、この記事に載せる段階では一旦「全て置換する」ように作っています(それが一番シンプルなので)。
そのあたりは用途に応じて関数の中身を書き換えていただければ、と思います。