よく作業するDirをBookmarkするshellスクリプト

  • 23
    Like
  • 2
    Comment
More than 1 year has passed since last update.

はじめに

zshやbashで作業しているとよく移動するDirというのがあると思います。
また、久しぶりにLoginしたサーバでは、どこが大事なDirかを忘れてしまうこともあるかと思います。

そういうときに、よく使うDirをBookmark?しておくと便利です。

追記: 2014/3/20

@mollifier さんが作成したzshによるPluginは補完が効くので更に便利です!
よく使うディレクトリをブックマークする zsh のプラグイン

準備

下記のようなものを .zshrc.bashrcに書いておきます。
書いたら source ~/.zshrc などして読み込んでください。

.zshrc
BMRC=~/.bmrc
touch $BMRC

bmls() {
  cat $BMRC | sort -n
}

bmvi() {
  # open BMRC with EDITOR.
  ${EDITOR:-vi} $BMRC
}

bmadd() {
  local bmdir=$PWD
  local newid=$1

  if __bm_path_list | grep -F -x "$bmdir" > /dev/null; then
    echo "$bmdir is already in bm list" 1>&2
    return 2
  fi

  if [ -n "$newid" ]; then
    if __bm_id_list | grep -F -x "$newid" > /dev/null; then
      echo "$newid is already used as bm id" 1>&2
      return 3
    fi
  fi

  if [ -z $newid ]; then
    local maxid
    maxid=$(__bm_id_list | grep '^[0-9][0-9]*$' | sort -n -r | head -1)
    if [ -n "$maxid" ] && [ "$maxid" -ge 1 ]; then
      newid=$((maxid + 1))
    else
      newid=1
    fi
  fi

  echo "$newid|$bmdir" >> $BMRC
}

bm() {
  local bmid=$1
  if [ -z "$bmid" ]; then
    bmls
    return
  fi

  local bmdir=$(__bm_get "$bmid")
  if [ -z "$bmdir" ]; then
    echo "$bmid is not in bm list" 1>&2
    return 1
  fi

  cd "$bmdir"
}

__bm_get() {
  escaped_bmid=$(echo "$1" | sed -e 's/[^a-zA-Z0-9<>]/\\&/g')
  cat $BMRC | grep -E "^${escaped_bmid}\\|" | cut -d '|' -f 2 | head -n 1
}

__bm_path_list() {
  cat $BMRC | cut -d '|' -f 2
}

__bm_id_list() {
  cat $BMRC | cut -d '|' -f 1
}

使い方

現在のDirをBookmark?に登録

bmadd <name> で登録します。

% bmadd idea

Bookmark登録されているDirの一覧を表示

bmとだけ打つと一覧が表示されます。

% bm
doc|/Users/k_morishita/Documents
down|/Users/k_morishita/Downloads
idea|/Users/k_morishita/IdeaProjects

そのDirに移動

bm <name> で移動します。

% bm doc

Bookmarkを編集

仕組みは単に ~/.bmrc にテキストファイルとして保存してあるだけです。
bmviと打つとそのファイルを編集する vi が起動します。何をどうすれば良いかは見ればわかると思います。

% bmvi

さいごに

10年以上前に書いたShellスクリプトなので拙い感じがアリアリですが、動くには動くのでお試し下さい。