LoginSignup
20
16

More than 5 years have passed since last update.

bashでディレクトリ移動を便利にする

Posted at

bashでディレクトリ間の移動を便利にする、拡張cdコマンドを紹介します。
これを使うと、わざわざpushdコマンドを使わずとも、自動的にディレクトリの履歴を保存してくれるようになります。

設定方法

最近の Cygwin/MSYS2 の .bashrc スケルトンファイル (/etc/skel/.bashrc) には、サンプルとして、この拡張cdコマンドが記載されています。
コメントには以下のように書かれています。

/etc/skel/.bashrc
# Some example functions:

    ...

# b) function cd_func
# This function defines a 'cd' replacement function capable of keeping, 
# displaying and accessing history of visited directories, up to 10 entries.
# To use it, uncomment it, source this file and try 'cd --'.
# acd_func 1.0.5, 10-nov-2004
# Petar Marinov, http:/geocities.com/h2428, this is public domain

これによると、パブリックドメインで公開されていたコードのようですが、geocitiesの閉鎖に伴い、元のサイトは見られなくなってしまっています。

cd_func 関数の本体は以下の通りです。これを .bashrc にコピー&ペーストすれば設定完了です。

cd_func ()
{
  local x2 the_new_dir adir index
  local -i cnt

  if [[ $1 ==  "--" ]]; then
    dirs -v
    return 0
  fi

  the_new_dir=$1
  [[ -z $1 ]] && the_new_dir=$HOME

  if [[ ${the_new_dir:0:1} == '-' ]]; then
    #
    # Extract dir N from dirs
    index=${the_new_dir:1}
    [[ -z $index ]] && index=1
    adir=$(dirs +$index)
    [[ -z $adir ]] && return 1
    the_new_dir=$adir
  fi

  #
  # '~' has to be substituted by ${HOME}
  [[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"

  #
  # Now change to the new dir and add to the top of the stack
  pushd "${the_new_dir}" > /dev/null
  [[ $? -ne 0 ]] && return 1
  the_new_dir=$(pwd)

  #
  # Trim down everything beyond 11th entry
  popd -n +11 2>/dev/null 1>/dev/null

  #
  # Remove any other occurence of this dir, skipping the top of the stack
  for ((cnt=1; cnt <= 10; cnt++)); do
    x2=$(dirs +${cnt} 2>/dev/null)
    [[ $? -ne 0 ]] && return 0
    [[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
    if [[ "${x2}" == "${the_new_dir}" ]]; then
      popd -n +$cnt 2>/dev/null 1>/dev/null
      cnt=cnt-1
    fi
  done

  return 0
}

alias cd=cd_func

使い方

cd コマンドでディレクトリを移動すると、自動的に最新10個までのディレクトリの履歴が保存されます。

cd -- で、保存されている履歴が表示されます。
例:

$ cd --
 0  ~
 1  /etc
 2  /usr/bin

cd -n で、履歴の n 番目のディレクトリに移動することが出来ます。
この例の場合、cd -2/usr/binに移動します。

直前のディレクトリに戻るには、cd -1 だけでなく、従来通り cd - も使えます。

参考

20
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
16