意外と使えるcd - とdirsコマンド

意外と使えるけれどみんなあまり知らないlinuxコマンドテクニックです

TL;DR

cd -

普段ディレクトリを移動する際は cd を使いますが,引数として-を与えてあげると違った挙動をします.

例えば最初にルートディレクトリに移動,次にホームディレクトリ以下のsadboxに移動してみます

 / ❯❯❯ cd /
/ ❯❯❯ ls
Applications              Volumes                   home                      sbin
Library                   bin                       installer.failurerequests tmp
Network                   cores                     net                       usr
System                    dev                       opt                       var
Users                     etc                       private
/ ❯❯❯ cd ~/.sandbox
~/.sandbox ❯❯❯ ls
1.aux                     1.out                     Gemfile                   missfont.log
1.dvi                     1.pdf                     Gemfile.lock              naltoma.txt
1.fdb_latexmk             1.synctex.gz              a.out                     prezto-fasd-cache.501.zsh
1.fls                     1.tex                     hoge.c                    texrepo
1.log                     1.toc                     hoge.rb                   vendor
~/.sandbox ❯❯❯ pwd
/Users/anatofuz/.sandbox
~/.sandbox ❯❯❯ cd -
/
/ ❯❯❯ pwd
/
/ ❯❯❯ cd -
~/.sandbox
~/.sandbox ❯❯❯ pwd
/Users/anatofuz/.sandbox

こういった用に cd -を使うと直前のディレクトリを行き来する事が可能です.

dirs

ディレクトリを移動する際に,現在いるカレントディレクトリがディレクトリスタックというスタックに保存されます. スタックとはFirst In Last Out(FILO)とも呼ばれ,つまり最初に入ったやつが最後に出てくるデータ構造です.

例えばディレクトリスタックが次のようになっている場合

dirs                                                                                                      [20:14:04]
~ ~/.sandbox ~/workspace/github ~/workspace

これは最初に ~/workspaceにcdし,次に ~/workspace/githubにcdを行い, 続いて ~/.sandboxにcdした後に最後にホームディレクトリに移動したことを表しています.一番左が現在のカレントディレクトリで,時系列的に右に進むと良いということがわかります.

例えば

 anatofuz@anatofuz  ~/.sandbox 
 ❯ cd                                                                                                        [20:18:55]

 anatofuz@anatofuz  ~ 
 ❯ dirs                                                                                                      [20:18:56]
~ ~/.sandbox ~/workspace/github ~/workspace

 anatofuz@anatofuz  ~ 
 ❯ cd workspace/bitbucket                                                                                    [20:19:03]

 anatofuz@anatofuz  ~/w/bitbucket 
 ❯ dirs                                                                                                      [20:19:04]
~/workspace/bitbucket ~ ~/.sandbox ~/workspace/github ~/workspace

この用に移動するとカレントディレクトリがディレクトリスタックに詰まっていきます. これはvオプションを付けるとよりわかりやすくなるかと思います.

dirs -v                                                                                                   [20:13:10]
0  ~
1  ~/.sandbox
2  ~/workspace/github
3  ~/workspace

これで言うところの0が現在のカレントディレクトリ.3が最初にcdした先ですね.

popd

このディレクトリスタックをpopつまり一番最近のものを取り出していくのがpopdコマンドです.

先程の状況で検証してみると

 ❯ pwd                                                                                                       [20:23:37]
/Users/anatofuz

 anatofuz@anatofuz  ~ 
 ❯ popd                                                                                                      [20:23:38]

 anatofuz@anatofuz  ~/.sandbox 
 ❯ pwd                                                                                                       [20:23:39]
/Users/anatofuz/.sandbox

 anatofuz@anatofuz  ~/.sandbox 
 ❯ popd                                                                                                      [20:23:40]

 anatofuz@anatofuz  ~/w/github 
 ❯ pwd                                                                                                       [20:23:41]
/Users/anatofuz/workspace/github

この用に順にディレクトリが移動していっています. なお + 2などつけるとその分ディレクトリが消されます

pushd

pushdはその逆で,カレントディレクトリをディレクトリスタックに積み上げます

zshなら

zshならオプションで設定する必要がありますが, cd -でタブを押すことで ディレクトリスタックが可視化され,簡単にcdする事ができます.

f:id:anatofuz:20180518200330p:plain

 ❯ dirs                                                                                                      [20:02:51]
~ ~/.sandbox ~/workspace/github ~/workspace

 anatofuz@anatofuz  ~ 
 ❯ cd -0/                                                                                                    [20:02:51]
 -- directory stack --
0 -- ~/workspace
1 -- ~/workspace/github
2 -- ~/.sandbox