お久しぶりです、開発部の石原です。
日々の業務の中で、よく使うファイルやディレクトリというものが存在します。Tabでの補完があるとはいえ、長いものをいちいち入力するのはなかなか面倒です。
初めのうちはスニペットを登録して呼び出していたのですが、数が増えてきてついに覚えきれなくなったため、自作コマンド化してみました。
今回つくったのは、頻用ディレクトリにエイリアスをつけ、部分一致を使って簡単に移動できるコマンドです。
流れ
- エイリアスとフルパスのリストをcsvで作る
- エイリアスを選んだら、該当するディレクトリに移動する
- これをcdd(cd directoryの略)という自作コマンドにして、いつでもターミナルで呼び出せるようにする
やったこと
絞り込み部分にはpecoというツールを使いました。
同じことにチャレンジしたい方はこちらをあらかじめ入れておいてください。
homebrewの入ったmacであれば、以下のコマンドでインストールできます。
1 |
$ brew install peco |
pecoとは?
対話的に選択肢を選べるのが特徴の、部分一致での検索機能がついたテキストフィルタリングツールです。
lsやcatの結果をpecoにかけると、絞り込んでの選択が可能になるため、目的の情報を探すのがとても楽になります。
1 2 |
$ cat sample.txt | peco //catの結果が表示され、入力に応じて行が絞り込める |
遷移先ディレクトリのリストを作る
短縮名と実際の値のペアをCSVファイルに登録しておきます。
今回はディレクトリのパスにしていますが、コマンドのオプションなどでも使えると思います。
1 2 3 4 |
app1,/Users/username/....../app1 app2,/Users/username/....../app2 app3,/Users/username/....../app3 //略 |
コマンドの実態を作る
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/sh #set -aux CSV_FILE="/path/to/move_list.csv" #CSVファイルからディレクトリ情報を読み取り、一項目目をpecoの選択肢にする。 selected_alias=$(cut -d',' -f1 "$CSV_FILE" | peco) #選択結果がselected_aliasに入る。 #選択されたディレクトリのフルパスを取得 selected_path=$(grep "^$selected_alias," "$CSV_FILE" | cut -d',' -f2) #selected_aliasのある行の二項目目がselected_pathに入る #選んだディレクトリを返す if [ -n "$selected_path" ]; then echo "$selected_path" fi |
ターミナルで常時使えるように設定
私はzshを使っているため、 ~/.zshrc
を編集します。
bashユーザなら.bashrc や .bash_profileに書いてください。
1 2 3 4 5 |
//元からの記述に以下を追加し、 cddコマンドを追加 function cdd(){ CDD_PATH=$(source cdd.sh) #cdd.shのecho内容をCDD_PATHにいれる cd $CDD_PATH } |
動きを見る
csvに書いたリストの中から、該当の文字を含むエイリアスだけを表示し、そのディレクトリに移動できるようになりました。
動画の内容は以下の通りです。
- ~/に移動(通常のcdコマンド)
- cddコマンドを実行
- sampleを部分一致で検索し、選択
- sampleをエイリアスに設定してあるディレクトリに移動
- doc_rootを部分一致で検索し、選択
- doc_rootをエイリアスに設定してあるディレクトリに移動
今回のディレクトリはデモ用なのでありがたみがあまりありませんが、案件ごとのディレクトリの奥深くにある設定ファイルを一発で開いて編集したいケースなどには重宝します。
余談
cdd.shの中ではなく、cddコマンドの中にフォルダ移動処理を入れたのには理由があります。
スクリプト内でcdしても、スクリプト実行完了後に元のディレクトリに戻ってしまうからです。
このことになかなか気づかず、実装時は苦戦しました。
1 2 3 4 |
$ #最初は~/にいる $ cdd #間接的にシェルスクリプトを実行。 #シェルスクリプト内で cd ~/sample すると、その後のスクリプト内の処理は ~/sample で実行される $ #スクリプトの実行が終わると、~/に戻る |
echoした結果を使ってcd
今回のケースです。今までのシェル上に帰ってこられるので、シンプルかつ合理的だとおもいます。
シェルスクリプト内でcd
cdd.sh内のecho部分を変更し、以下のように新規シェルを開かせれば、ターミナル上でも移動後のフォルダに残ることができます。
ただ、サブシェルが開いた状態になるので、cdd.shを実行するたびにシェルがどんどん入れ子になってしまいます。
ターミナルを閉じる時にいちいち確認されるため、操作性としてもいまいちです。推奨しません。
1 2 3 4 |
//前略 #echo "$selected_path" #これをやめる cd"$selected_path" exec zsh #新しくシェルを開く |
おまけ
今回のコーディングにはChatGPT3.5に手伝ってもらいました。
このように質問をすると、今回のようなスクリプトを教えてくれます。
folder_alias, folder_full_path という形式のcsvファイルを作り、これを使って対話的にディレクトリ移動をできるようにしたいです。
csvファイルの各行の1項目を表示し、pecoで選択し、2項目(パス)にcdで移動するシェルスクリプトを書いてください。