cd
まずはcd
(Change Directory)の簡単なまとめ。
1
2
3
| cd directory # Go to directory
cd # = cd ~, Go to $HOME
cd - # Go to previous directory
|
通常、directory
をした場合、カレントディレクトリから相対的に移動するか、
/
で始まればそれによって指定された絶対パスに移動します。
-
を使うと直前に居たディレクトリに帰る事が出来、良く使うと思いますが、
1回-
を使った後は、戻る前に居たディレクトリが記憶されるので、
cd -
を繰り返すと前に居たディレクトリとカレントディレクトリを行ったり来たり
するだけです。
さらに前のディレクトリに行きたいときは下の様に予めpushd
等で
移動しておく必要があります。
ここでCDPATH
と言うシェル変数があって、良く使う親ディレクトリの場所を
指定しておくと、どのディレクトリからcd
しても、CDPATH
内にかかれた
親ディレクトリ内に指定のディレクトリがある場合、そのディレクトリに移動します。
1
2
3
4
5
6
7
8
9
10
11
12
13
| $ cd /tmp
$ mkdir -p test1/test2
$ CDPATH=/tmp/test1/
$ cd test2
/tmp/test1/test2
$ cd /tmp
$ mkdir test2
$ cd test2
/tmp/test1/test2
$ cd /tmp
$ cd ./test2
$ pwd
/tmp/test2
|
CDPATH
内で指定されているディレクトリが最優先されているので、
カレントディレクトリに同名のディレクトリがあったとしても
CDPATH
内に書かれたディレクトリ内にあるディレクトリが優先されます。
(なので明示的に./
を使う必要があります。)
逆に混乱の元にもなるので、余程特殊なディレクトリ名だけがあるような
親ディレクトリでない場合は使わないほうが無難です。
CDPATH
へはPATH
等と同様に:
で区切って
複数のディレクトリを指定することが出来ます。
pushd/popd
cd
の代わりにpushd
を使うと移動と同時に移動先のディレクトリを記憶します。
popd
を使うと記憶されたディレクトリの新しい順に
戻っていくことが出来ます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| $ cd /tmp
$ mkdir -p test1/test2
$ pushd test1/
/tmp/test1 /tmp
$ pushd test2/
/tmp/test1/test2 /tmp/test1 /tmp
$ pushd ../
/tmp/test1 /tmp/test1/test2 /tmp/test1 /tmp
$ popd
/tmp/test1/test2 /tmp/test1 /tmp
$ popd
/tmp/test1 /tmp
$ popd
/tmp
$ popd
bash: popd: directory stack empty
/tmp $
|
pushd
/popd
ではさらに数字を指定することによって
n回前のディレクトリに戻る、といったことも出来ますがここでは省略します。
cdをpushdのwrapperにする
過去の移動歴を覚えてくれるのは便利ですが、毎回pushd
を
するのは大変な上、ディレクトリがいちいち表示されて嫌なので、
cd
をpushd
へのwrapper functionにしています。
素直にalias cd='pushd >/dev/null'
でも殆ど変わらないですが、
1番最初のディレクトリを記憶したり、
ディレクトリの中のファイル名まで指定してしまった時にその親ディレクトリに
移動したりと(Tabで探してる時等にたまに行きすぎてしまった時とか)、
細かいところを調整しています。
追記: 2014/06/22
pushd
の機能を何か勘違いしてましたが、
pushd
は現在のディレクトリを保存して指定のディレクトリに移動
を行うので、まさに上でやりたかったことをそのままやっています。
なので上のwrapperのファイル以外の変更は全く無意味。。。
GitHubの方に公開してるsd_cl
の方でも余計なことやってましたが治しました。
追記ここまで
popd
も保存されているディレクトリ名が表示されるので
上の様にbd
(Back Directoryのつもり)にaliasして
何も表示せずにディレクトリを遡って行ける様にしています。
使う場合は.bashrc
にでも加えて下さい。
異なるプロセス上でディレクトリ情報を共有する
複数のターミナルを開いて作業していたり、
screen
等で複数ウィンドウを開いて作業をしていると、
一方のウィンドウの作業ディレクトリに、他方のウィンドウも
移動させたい時が良くあると思います。
違うターミナルを開いている時はpwd
でカレントディレクトリ
を表示させてマウスでコピペしたりするでしょうし、
screen
などではコピーモードを使って表示された
ディレクトリをコピペするかと思いますが、
ちょっと面倒です。
そこで、次の様な関数などを使って簡単にディレクトリ情報を共有するようにしています。
sd
と言う関数でカレントディレクトリを記憶して
cl
と言う関数で記憶されたディレクトリに移動します。
一方のウィンドウでsd
してもう一方のウィンドウでcl
すれば同じディレクトリに
行けるわけです。
また、cl
オプションとして
cl -l
: 記憶したディレクトリの一覧の表示
cl -c
: 記憶したディレクトリの一覧を表示し、選択した番号のディレクトリへ移動
cl -n N
: N番目の記憶されたディレクトリへ移動
が出来ます。
設定変数は
- LASTDIRFILE: 記憶するディレクトリの
- NLASTDIR: 記憶するディレクトリの数
上記設定でpushd
が常に行われる設定にしていますが、
このsd
を使うことで、1つのウィンドウだけで作業している時でも、
特定のディレクトリだけを覚えておいて後で簡単に戻る、という使い方も出来ます。
これも使う場合は.bashrc
にでも加えください。
追記: 2013/12/27
sd/clコマンドアップデート:
ターミナルでのディレクトリ移動を保存、取り出しする
追記ここまで