cdコマンドは、"change directory"の略で、ディレクトリを変更するための基本的なコマンドになります。コマンドを実行すると、現在の作業ディレクトリ(カレントディレクトリ)が指定したディレクトリに変更されます。
cdコマンドが指定するパスには絶対パスと相対パスがあります。絶対パスはルートから始まり、相対パスは現在のディレクトリからの位置を示します。
絶対パスでは、現在の位置に依存せずにディレクトリを移動しますが、相対パスは現在の位置に基づいて目的のディレクトリを指定します。
また、使う頻度は少ないですがcdコマンドにはオプションとしてシンボリックリンクに関係したオプションがあります。
ディレクトリの変更と特殊なディレクトリ指定
cdコマンドはパスを指定することで作業ディレクトリを移動することができます。
1 2 3 4 5 |
$ ls Docs $ cd Docs/ $ pwd /home/ubuntu/cd_test/Docs |
よく使われる指定方法として".."もあり、これは一つ上のディレクトリを指定することができます。
また、"../.."とすると2つ上のディレクトリを指定することも可能です。
同じように、特殊な指定方法には以下のようなものがあります。
指定方法 | 説明 |
---|---|
現在のディレクトリ | |
. | 階層が一つ上のディレクトリ |
- | 直前のディレクトリ |
また、ディレクトリを指定する際に~(チルダ)はホームディレクトリを表します。"~/cd_test/Docs"みたいな指定をすることも可能です。
また、cdコマンドは何も指定しない場合はホームディレクトリに移動します。
1 2 3 4 5 6 7 8 9 10 11 |
$ PS1="Work Dir:\w $ " Work Dir:~/cd_test/Docs $ cd .. Work Dir:~/cd_test $ cd .. Work Dir:~ $ cd /home/ubuntu/cd_test/Docs/ Work Dir:~/cd_test/Docs $ cd Work Dir:~ $ cd / Work Dir:/ $ cd ~/cd_test/Docs/ Work Dir:~/cd_test/Docs $ cd - / Work Dir:/ $ cd Work Dir:~ $ |
PS1は端末に表示されるプロンプト文字列を変える変数になります。
この変数によく使われる特別な文字で\uはユーザー名、\hはホスト名、\wは作業ディレクトリを表し、ここでは移動を分かりやすくするために変更しました。
このプロンプト文字列の特殊な文字については'man bash'のPROMPTINGのセクションに記述があります。
絶対パスと相対パス
絶対パスは、ルートディレクトリ(/)から始まり、目的のディレクトリまでの完全なパスを示します。例えば、/home/user/Documentsは、ルートディレクトリから始まり、userディレクトリの中のDocumentsディレクトリを示します。
相対パスは、現在の作業ディレクトリから目的のディレクトリまでのパスを示します。例えば、lsコマンドで現在のディレクトリの内容を調べた後にその中のDocumentsディレクトリへ移動したい場合、'cd Documents'のように相対パスを使います。
相対パスは、現在の位置からの相対的な位置を示すため、短縮された形式で表現できますが、現在の作業ディレクトリに依存するため、状況によっては使いにくい場合もあります。
ワイルドカードを使用してパスを指定
ワイルドカードとは、ワイルドカードは、ファイル名やディレクトリ名のパターンを表現するための特殊文字になります。
ここでは詳細には説明しませんが、例えば、*は0個以上の任意の文字列マッチします。cdの機能というよりシェルの機能ですが、一応紹介します。
cdコマンドでワイルドカードを使って指定した場合、一つだけにマッチするときはそのマッチしたディレクトリに移動することができます。
1 2 3 4 |
Work Dir:~/cd_test $ ls Docs Docs-another Work Dir:~/cd_test $ cd Docs-* Work Dir:~/cd_test/Docs-another $ |
これだけだと単にTabキーを使って補完しても十分に楽ができます。別の例として、
1 2 3 4 5 6 7 8 9 10 |
Work Dir:~/cd_test $ tree . ├── Docs │ ├── aaa │ │ ├── bbb │ │ │ └── ccc │ │ │ └── targetdir │ │ └── bbb2 │ └── aaa2 └── Docs-another |
のように階層が深いディレクトリの場合、一意に指定できるなら
1 2 |
Work Dir:~/cd_test $ cd */*/*/*/* Work Dir:~/cd_test/Docs/aaa/bbb/ccc/targetdir $ |
のように指定することができます。
補足として、Bashのシェルオプションでglobstarというオプション(デフォルトでOFF)をONにすると目的のディレクトリまでの途中のディレクトリの間を**で省略することが可能になります。
ただし、これは下の階層のディレクトリを探索していっているので、例えば、ルートディレクトリから行うと時間がかかってしまうことに注意してください。
1 2 3 4 5 |
Work Dir:~/cd_test $ shopt -s globstar Work Dir:~/cd_test $ cd **/t* Work Dir:~/cd_test/Docs/aaa/bbb/ccc/targetdir $ cd - /home/ubuntu/cd_test Work Dir:~/cd_test $ shopt -u globstar |
shoptコマンドは-sオプションでシェルオプションをONに、-uオプションでシェルオプションをOFFにできます。
シンボリックリンクの扱い(-P/-Lオプション)
cdコマンドは、シンボリックリンクを辿るか、物理的なパスとして解決するか異なる場合があります。
Bashのデフォルト動作は-Lオプションでシンボリックリンクを辿って、ディレクトリの移動をします。
1 2 3 4 |
Work Dir:~ $ cd sym_prog Work Dir:~/sym_prog $ cd .. Work Dir:~ $ cd -P sym_prog Work Dir:~/prog $ |
基本的に物理的なパスとして解決を行いたい場合は
1 |
alias cd='cd -P' |
で動作を変えることができます。