LinuC Level1 v10.0 対策コース(パート1)16/39
Linuxコマンド [pwd/rm/mkdir/rmdir編]
Linuxを操作する上で欠かせない「ディレクトリ・ファイル」を取り扱うコマンドについて解説します。
ディレクトリ・ファイル操作の基本
今回学ぶのは、pwd
, rm
, mkdir
, rmdir
の4つのコマンドです。これら4つのコマンドを理解することで、Linux操作における重要な「ディレクトリ・ファイル」についての基本的な取り扱いができるようになります。
これらは頻繁に使用するコマンドなので、ぜひ習熟して覚えてください。
パス(PATH)とは
パス(PATH)は、英語で「道・道のり・経路」という意味です。
Linuxにおけるパスは、「ファイルのある場所までの道のり」を表します。
Linuxにおけるファイルシステムでは、ディレクトリが階層構造になっています。パスは、どのファイルがどのディレクトリ配下にあるかを表すものと理解してください。
パスの詳細な解説に入る前に、ディレクトリを表す記号について確認しておきましょう。
記号 | 説明 |
---|---|
. | カレントディレクトリ(現在いるディレクトリのことです) |
.. | 一つ上の階層(ディレクトリ) |
/ | ルートディレクトリ |
~ | ホームディレクトリ |
- | ひとつ前にいたディレクトリ |
例えば、ホームディレクトリに移動するときは以下のようなコマンドを実行します。
cd ~
※ ただし、チルダ(~
)なしでもcd
だけでホームディレクトリに移動できます。よって、ホームディレクトリ配下のファイルやディレクトリのパスを表現する場合にチルダを使用することが一般的です。
cd ~/hoge
パスには、 絶対パス と 相対パス の2つの種類があり、それぞれ起点となるディレクトリが異なります。ここで、それぞれの特性について解説します。
絶対パス
絶対パスは、/
(ルートディレクトリ)を起点にした、ファイルの場所を示すパス です。
(絶対パスを「フルパス(full path)」ということもあります。)
/
├── usr
├── bin
├── sbin
└── local
├── bin
└── lib
上記のディレクトリ構造において、lib
を絶対パスで表すと、/usr/local/lib
となります。最初のスラッシュはルートディレクトリを表していますが、それ以降のスラッシュは階層を区切るために使用しています。
相対パス
相対パスは、 カレントディレクトリを起点にした、ファイルのある場所を示すパス です。現在、絶対パスの例において/usr/local/lib
というディレクトリにいるとします。このとき、/usr/sbin
を相対パスで表すと、../../sbin
(ふたつ上の階層である/usr
配下の/sbin
) となります。
パスを通すとは
全てのLinuxコマンドの実態は実行ファイルです。その実行ファイルは/bin
や /usr/bin
、/usr/local/bin
などのディレクトリに置くことになっています。
たとえば、cat
コマンドのフルパスは/bin/cat
です。
which cat
/bin/cat
このフルパスを実行することと、cat
のみをコマンドとして実行することは同じことです。しかし、私達がcat
コマンドを実行する際にわざわざcat
コマンドのフルパスをタイプすることはありません。上の例のように、私達がコマンドを実行する際には、ターミナルでコマンド名のみをタイプしてEnterキーを押します。
ただし、コマンド名のみで実行するためには、シェルが該当の実行ファイルがどのディレクトリにあるのかを把握している必要があります。あなたが過去にコマンドを実行したときに、 <コマンド名>: command not found
というエラーメッセージに遭遇したことがあるかもしれません。
シェルにあらかじめファイルの場所(=パス)を知らせるためには、そのファイルのあるディレクトリのフルパス( コマンドサーチパス )を環境変数 PATH にエクスポートする必要があります。このように、環境変数PATHにコマンドサーチパスを設定することを「パスを通す」といいます。
※ ここでのフルパスは、シェルが実行ファイルを探す際に手がかりとなるパスであることから、”コマンドサーチ(検索)パス”と呼ばれます。「パスを通す」の”パス”は、”コマンドサーチパス”のことを指しています。
echo
コマンドで、環境変数PATHに設定されているパスを確認してみましょう。
echo $PATH
/usr/bin:/usr/sbin:/bin:/sbin:/usr/local/bin
複数のパスが設定されており、それぞれのパスがコロン(:
)で区切られていることが分かります。
先ほど見たcat
コマンドは、/bin
配下に置かれていました。環境変数PATHを見てみると、先頭から3番目に/bin
が確認できます。つまり、cat
コマンドにはパスが通っているということになります。
なお、先述した<コマンド名>: command not found
はパスが通っていない場合に出るエラーです。これを解決してコマンドを実行可能な状態にするには、パスを通してあげればよいのです。
# /usr/local/sbin にパスを通します。
# 書式 : export PATH=$PATH:[新たに追加したいパス]
export PATH=$PATH:/usr/local/sbin
export
コマンドの後に続く最初の PATH
は環境変数PATHを示します。そして、等号(=)の後に続く $PATH
は、既に環境変数PATHに設定されているパスを指します。その後に続く :新たに追加したいパス
で新たなパスを追加することができます。
※ ちなみに、cd
やecho
のようなシェルのビルトインコマンド(shell built-in command, シェル内部に組み込まれているコマンド)は、パスを通さずとも初めから使えます。
【TIP-1】カレントディレクトリにあるファイルを実行する方法??
Linuxでは、デフォルトではカレントディレクトリにはパスが通っていません。セキュリティの観点から、カレントディレクトリを環境変数PATHに追加することは一般的には推奨されていません。それでは、カレントディレクトリにあるファイルを実行するにはどうしたらよいでしょうか?
例えばmv
コマンドやcp
コマンドでパスの通っているディレクトリにファイルを格納してから実行する方法もあります。それも可能ですが、やる前から非効率な方法だと気付くはずです。
そこで、前述したcat
コマンドの例で「フルパス(/bin/cat
)を実行するのとcat
のみを実行するのは同じことです」とご説明したことを思い出してください。つまり、ディレクトリにパスが通せないこんな状況でこそ、逆にフルパスでファイルを実行するという方法が挙げられます。
例えば、カレントディレクトリにtest.sh
というというシェルスクリプトの実行ファイルを作成したとします。
# あらかじめ、zshのパスを調べておきます。
which zsh
/bin/zsh
# 'test.sh'というシェルスクリプトを作成します。ここでは `vi` コマンドを利用して編集したとします。
vi test.sh
# 書き込み内容は以下
=========================
1 | #!/bin/zsh # 1行目にはシバン(shebang)を記述します。事前に調べておいたzshのパスを指定します。
2 | echo "Succeeded!" # 無事実行できたら、"Succeeded!"と表示します。
=========================
# test.shは実行ファイルですので、実行権限を付与しておきます。
chmod 744 test.sh
ls -l test.sh
-rwxr--r-- 1 envader redavne 11 6 17 18:16 test.sh
準備が整ったので、実行していきましょう。
なお、カレントディレクトリは、ピリオド(.
)で表現できるため、カレントディレクトリのtest.sh
は以下のようにフルパスを指定して実行できます。
./test.sh
Succeeded!
無事実行できました。このように、カレントディレクトリ(.と表現されます)に実行ファイルがある場合には、./の後にファイル名をつけて実行するようにしましょう。
pwdコマンドとは
pwd
はあなたが作業しているディレクトリ(カレントディレクトリ)の位置を絶対パスで表示・確認するためのコマンドです。
pwdは「Print Working Directory」または「Present Working Directory」の略と言われています。
基本的な使い方
# hogehogeというユーザーのホームディレクトリにいる状態で実行してみます。
pwd
/home/hogehoge
【TIP-2】もうpwdコマンドはいらない!? [oh-my-zshの便利設定 編]
いちいちpwd
コマンドを実行するのが億劫だぁ…という方のために、oh-my-zshのテーマの便利設定をご紹介します。
なお、この解説はzshにoh-my-zshが既にインストールされていることを前提としています。
zshやoh-my-zshの導入がまだだったり、自分のターミナルで試すのは不安があるという方には、Envaderのターミナルカスタマイズコースにある『zshを使いこなそう』というシナリオをオススメします。
Envaderでは、Webアプリ上で実際に手を動かしながらターミナル操作を学べます。
今回は数あるテーマの中から、デフォルトで設定されているrobbyrussellを例に解説していきます。
はじめに、robbyrussellのテーマファイル(.oh-my-zsh/themes/robbyrussell.zsh-theme
)を確認しましょう。
# 以下では、説明上分かりやすいように行番号をつけて表示しています。ご了承ください。
cat .oh-my-zsh/themes/robbyrussell.zsh-theme
=======================================================================
1 |PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
2 |PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'
3 |
4 |ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}"
5 |ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
6 |ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}✗"
7 |ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%})"
=======================================================================
1~2行目はシェルプロンプトの設定、4~7行目はGitの表示設定です。
[]
の中の色を変更したり、➜
や✗
などを変更したりといった編集によって、表示される文字や記号の色を変えたり、記号そのものを変えたりというカスタマイズが可能です。今回は「常にカレントディレクトリのパスを表示するための設定」のみにフォーカスして解説していきます。
それでは、改めて2行目を見てみましょう。
2 |PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'
ここで%{$fg[cyan]%}
と%{$reset_color%}
に挟まれている%c
に注目します。これは「カレント(current)ディレクトリを表示する」という設定です。ただし、カレントディレクトリの表示設定には以下のようにいくつかの種類があります。
記号 | 説明 |
---|---|
%d | 絶対パスを表示 |
%~ | ホームディレクトリをチルダ(~)として絶対パスを表示 |
%c | カレントディレクトリのみを表示 |
%nc | nに指定した数値分だけ上位階層を表示(例 : %3cの場合、3階層上のディレクトリまで表示されます) |
このうち、%d
か%~
を設定することで、シェルプロンプトには常にカレントディレクトリの絶対パスが表示されます。
ここでは、%d
を設定します。2行目は以下のようになります。
2 |PROMPT+=' %{$fg[cyan]%}%d%{$reset_color%} $(git_prompt_info)'
上のように設定できたら、.zshrcを再度読み込みましょう。
source ~/.zshrc
ホームディレクトリが ➜ /Users/envader
のように表示されれば設定完了です。これで、 pwd
コマンドを逐一実行せずにカレントディレクトリを一目で把握できます。
rmコマンドとは
rm
は既存のファイルやディレクトリを削除する際に使用するコマンドです。
基本的な使い方
rm [オプション] ファイル名
使用例
# カレントディレクトリ配下にあるファイルを確認します。
ls
hoge.txt sample.txt
# hoge.txtを削除します。
rm hoge.txt
# 再度ディレクトリ配下を確認すると、hoge.txtがなくなっていることが分かります。
ls
sample.txt
主なオプション
オプション | 説明 |
---|---|
-r | 指定したディレクトリを削除します。 |
-v | 実行内容の経過が表示されます。 |
-f | 確認メッセージを出さずにファイルを削除します。 |
-i | 削除の実行前に確認メッセージが表示されます。 |
一度削除されたファイルを復元する事は原則できません。自分の作業に自信を持てるようになるまでは、-i
オプションを使用した方がよいかもしれません。
またrm *
と入力すると、作業中のディレクトリ内の全ての ファイル を削除する事ができます。 *
はワイルドカードといい、このコンテキストでは「全てのファイル」 を意味します。非常に大きな影響を及ぼす可能性があるため、慎重に扱うべきコマンドオプションであることを忘れないでください。
再帰的に削除
再帰的とは条件が一致した場合に自分自身の処理を繰り返すことです。rm
コマンドの場合は、-r
オプションをつけることで対象のディレクトリの中身全てを削除することが出来ます。この時、対象を削除する処理が各ディレクトリもしくはファイルに対して行われるわけですが、処理自体は一つの処理を何度もループします。そして処理が終わるごとに次に対象とする物が削除する対象の物か判断され、対象だった場合はもう一度自分自身を呼び出します。これを再帰的と言います。
# ディレクトリごと削除
rm -r ディレクトリ名
mkdirコマンドとは
mkdir
は新たにディレクトリを作成する際に使用するコマンドです。
基本的な使い方
mkdir [オプション] ディレクトリ名
主なオプション
オプション | 説明 |
---|---|
-m | パーミッション(実行権限)を指定して、ディレクトリを作成します。 |
-p | 存在しない親ディレクトリも含め、ディレクトリを階層的に作成します。 |
-v | ディレクトリ作成時の情報を表示します。 |
実行権限について詳しく知りたい方は、「Linux 実行権限」で調べてみて下さい。基本的にディレクトリは階層構造になっています。下記の例をご覧下さい。
使用例
# hoge_dirという名前のディレクトリを作成します。
mkdir hoge_dir
# カレントディレクトリの中を確認すると、hoge_dirが作成されていることが分かります。
ls -l
drwxr-xr-x 2 Yusuke1 staff 64 6 24 05:15 hoge_dir
ファイルの種類を表す先頭の記号がd
になっていることが分かります。
これはディレクトリ(directory)のdです。
# 空のカレントディレクトリで階層的にディレクトリを作成します。
mkdir -p hoge1/hoge2
# hoge1配下を確認すると、hoge2ディレクトリが作成されていることが分かります。
ls hoge1
/hoge2
このとき、hoge1はhoge2の親ディレクトリ、hoge2はhoge1の子ディレクトリと呼びます。 このように階層構造となっているディレクトリには親子関係があります。
rmdirコマンドとは
rmdir
は既存のディレクトリを削除する際に使用するコマンドです。
rm
コマンドで-r
オプションを指定してもディレクトリは削除できます。
基本的な使い方
rmdir [オプション] ディレクトリ名
主なオプション
オプション | 説明 |
---|---|
-p | 指定したディレクトリが空の場合、親ディレクトリも含めて削除する |
-v | ディレクトリ削除時の情報を表示します。 |
このrmdir
コマンドを使うと、中身が空のディレクトリしか削除する事ができません。つまり、中に何かしらのファイルが入っている場合、このrmdir
コマンドは使用できないのです。ディレクトリの中身ごと削除したい時は rm -r
コマンドを使用して下さい。
rm -r ディレクトリ名
-f
オプションを加えれば、強制的にディレクトリを削除できます。ぜひ覚えておいて下さい。
まとめ
Linuxでディレクトリ・ファイルを取り扱うための基本的なコマンドについて学習しました。ここで紹介したもの以外にも、各コマンドには様々なオプションや使い方があります。
問題を解くためには、十分な画面サイズのPC環境をご利用下さい。