All ASCII Linux Issue / Linux Magazine 2000年5月号
覚えておきたい必須コマンド30―その1・ファイルの基本操作
Linux操作の基本、ファイルやディレクトリ操作をコマンドでできるようになろう。
2001年5月31日
はじめに
Windowsを使ううえでコマンド画面を使うことはそう多くないだろう。DOSの時代を経験したユーザーなら、WindowsのいわゆるDOS窓を使いこなしているかもしれないが、最近PCを使うようになったユーザーはまず使わない。Macintoshにいたっては、コマンド画面そのものがないのだ。
一方、LinuxやUNIXではコマンドを多用することが多い。このご時世になんて前時代的なと思うなかれ、UNIXの世界にはDOS環境のCOMMAND.COMなどとは比較にならないほど高機能なシェル、そして、ひとつひとつは単純な機能しか持たないが、組み合わせることで強大な力を発揮する数々のコマンドが用意されている。これらを使いこなせば、GUIでは絶対にできないオペレーションも可能になる。
しかし、そのためにはまず個々のコマンドを知らなければならない。そこで、本特集では使用頻度が高いコマンドを中心に基本的な使い方を解説しよう。
これを読めばあなたはもうコマンドの使い手だ。
(中野 賢)
ディレクトリ位置の確認
コンソールから、ユーザー名とパスワードを入力しログインすると、
のようなプロンプトが表示される。
この状態では、ユーザーはホームディレクトリ(ログインディレクトリ)にいる。そして、現在、ユーザーのいるディレクトリのことをカレントディレクトリ(作業ディレクトリ)と呼ぶ。つまり、ログインした直後の状態では、ホームディレクトリがカレントディレクトリである。
カレントディレクトリの位置を確認するには、pwdコマンドを実行する。コマンドラインから、
とするだけだ。すると、
のように現在のディレクトリ位置が表示される。ログインした直後では、自分のホームディレクトリがカレントディレクトリになっている。
Linuxシステムは、図1のような木構造のディレクトリの上に構築されている。このうち、最上位のディレクトリは根っ子という意味でルートディレクトリと呼ばれる。すべてのディレクトリはここから始まる。
 |
ディレクトリ・ツリー |
ディレクトリの中にあるディレクトリはサブディレクトリと呼ばれる。たとえば、homeやtmpなどは、ルートディレクトリのサブディレクトリである。逆に、homeやtmpから見て、ルートディレクトリは親ディレクトリと呼ばれる。同様に、ken-naディレクトリはhomeディレクトリのサブディレクトリであり、ken-naディレクトリの親ディレクトリがhomeディレクトリである。
ディレクトリ階層は各ディレクトリを/で区切って表記する。ただし、ルートディレクトリには名前がないので、単に/とだけ表記する。先頭が/で始まると、それはルートディレクトリからのディレクトリ位置であることを示している。
先ほど、pwdコマンドで表示された/home/ken-naディレクトリは、
- ルートディレクトリ内の
- homeディレクトリ内の
- ken-naディレクトリ
を意味している。先頭に/を付けずに、home/ken-naと指定すると、
- カレントディレクトリ内の
- homeディレクトリ内の
- ken-naディレクトリ
という意味になる。
/がディレクトリの区切りとしての意味と、ルートディレクトリ自身を示すという2つの意味を持つことを覚えておこう。
(中野 賢)
ディレクトリの移動
ディレクトリを移動するにはcdコマンドを使う。引
数には、移動したいディレクトリの名前を指定する。たとえば、/usrディレクトリに移動したいときは、次のようにする。
実行すると、カレントディレクトリが/usrディレクトリに移動しているはずだ。pwdコマンドで確認してみよう。
cdコマンドに移動先を指定しないで実行すると、ホームディレクトリに移動する。
USER$ cd
USER$ pwd
/home/ken-na
|
ここで、lsコマンドにaオプションを指定して実行してみよう。lsコマンドはディレクトリの内容を表示するためのコマンドだ。
USER$ ls -a
. .emacs .xemacs
.. .emacs20 Desktop
.Xdefaults .gimp howto
.bash_history .gtk memo.txt
.bash_profile .kde
.bashrc .kderc
|
表示されたディレクトリの中に、ドット(.)と2つのドット(..)がある。「.」はカレントディレクトリを指し、「..」は親ディレクトリを指している。したがって、
は、カレントディレクトリへの移動を実行している。もちろん、ディレクトリ位置は変わらない。
とすれば、親ディレクトリに移動する。pwdコマンドを実行してみよう。
カレントディレクトリが/homeディレクトリになったことを確認できた。再び、lsコマンドでディレクトリの内容を表示してみよう。
USER$ ls -a
. .. ftp httpd ken-na samba
|
当然、ここにも.と..がある。さらに親ディレクトリに移動してみる。カレントディレクトリはルートディレクトリになる。
USER$ cd ..
USER$ pwd
/
USER$ ls -a
. boot home mnt sbin var
.. dev lib proc tmp
bin etc lost+found root usr
|
ルートディレクトリにも「.」と「..」が存在する。カレントディレクトリを意味する.は理解できるにしても、親ディレクトリを意味する「..」があるのはおかしいような気がするかもしれない。これは、Linuxのファイルシステムの性質上、すべてのディレクトリが「.」と「..」を持っているという理由で表示されているだけだ。ルートディレクトリの上には何もない。
今度は、ディレクトリ階層を降りていってみよう。サブディレクトリに移動するときには、先頭に/を付けない。カレントディレクトリがルートディレクトリの場合は、/を付けても付けなくても同じだが、ルートディレクトリ以外の場所では指定している位置が異なってしまう。
USER$ cd usr
USER$ cd X11R6
USER$ cd lib
USER$ cd X11/locale/C
USER$ pwd
/usr/X11R6/lib/X11/locale/C
|
ディレクトリが存在することを知っていれば、複数のディレクトリ名を/で区切って指定してもかまわない。だが、指定したディレクトリが存在しない場合は、次のようなエラーとなる。
USER$ cd X11/locale/japanese
bash: X11/locale/japanese: No such file or directory
|
X11が存在しないときでも、localeでも、japaneseでも、どこかのディレクトリが存在していなければエラーとなる。ディレクトリがあるかどうか、不安な場合は少しずつ移動するほうがよいだろう。
先頭を/で始めない指定での移動では、カレントディレクトリを基準にしている。このようなパス表記を相対パスと呼ぶ。対して、先頭が/で始まる、pwdの表示のようなパス表記を絶対パスと呼ぶ。
コマンドラインでの操作は、オプションでファイルやディレクトリの位置を指定することが多い。目的のファイルやディレクトリの記述を短くすれば、それだけキー入力を少なくすることができる。特に、「.」と「..」は頻繁に用いるので、いろいろと試して慣れてほしい。
Linuxのディレクトリツリーは、おおよそ、次のように分類されている。
表1 Linuxのディレクトリ分類
| ディレクトリ |
目的 |
| bin |
プログラムファイル |
| boot |
システムの起動に用いるファイル |
| dev |
デバイスファイル |
| etc |
システム設定ファイル |
| home |
各ユーザーのホームディレクトリ |
| mnt |
ファイルシステムを一時的にマウントするのに使う |
| proc |
プロセステーブル |
| root |
rootユーザーのホームディレクトリ |
| sbin |
システム管理用途のプログラムファイル |
| tmp |
一時的なファイルの置き場所に使う |
| usr |
ユーザーが日常利用するプログラムやライブラリ |
| var |
ログファイルやスプールなど |
X Window Systemでのカレントディレクトリ
コンソールやtelnetでログインしたときには、カレントディレクトリは必ずホームディレクトリになっている。
しかし、X Window System上での、ktermなどの端末エミュレータを開いたときは、ホームディレクトリであるとは限らない。
たとえば、ルートウィンドウから起動したktermではホームディレクトリがカレントディレクトリになっている。けれども、すでに開いているkterm上から、
として、/tmpディレクトリに移動後、
として起動すると、そのktermのカレントディレクトリは/tmpになっている。
同一のディレクトリで複数の端末エミュレータを開いて作業をしたい場合は、最初に移動しておいて、そこでktermやXアプリケーションを実行すると便利だ。
|
(中野 賢)
ディレクトリ内容の表示
先ほど、ディレクトリの内容を表示するのにlsコマンドを用いた。ここで、lsコマンドについてもう少し詳しく説明しよう。
lsは引数としてディレクトリを指定しないと、カレントディレクトリの内容を表示する。
USER$ ls
Desktop howto memo.txt
|
ただし、ドットで始まる名前は表示しない。すべてのファイルを表示するには、aオプションを付ける。
親ディレクトリの内容を表示するのも「..」を用いれば簡単だ。
USER$ ls -a ..
. .. ftp httpd ken-na samba
|
これまでの実行例では表示される名前がディレクトリなのかファイルなのかがわからない。Fオプションを指定すると、種類に応じて名前のうしろに/や@が付く。/が付いているのがディレクトリで、@が付いているのはシンボリックリンクのファイルを示している。記号の付いていないファイルは、通常のファイルだ。
USER$ ls -aF
./ .emacs .xemacs
../ .emacs20 Desktop/
.Xdefaults .gimp/ howto@
.bash_history .gtk/ memo.txt
.bash_profile .kde/
.bashrc .kderc
|
ファイルサイズや作成した日付を表示したい場合は、lオプションを用いる。すべてのファイルを表示するにはaオプションも同時に指定する(図2)。
 |
lsの詳細表示 |
lオプションでは、ファイルの種類と許可、リンク数またはディレクトリ数、所有者、グループ、ファイルサイズ、最終修正時刻、名前が出力されている。
ファイルの種類は、通常のファイル(-)、ディレクトリ(d)、シンボリックリンク(l)、デバイスファイル(bまたはc)が区別される。
許可はパーミッションとも呼ばれ、所有者、グループ、その他のユーザーに対して、それぞれ読み取り、書き込み、実行の許可の有無を示している。たとえば、
のようになっているファイルは、所有者とグループは読み込みと書き込みができるが、その他のユーザーは読み込みしかできないことを意味している。
は、すべてのユーザーが読み込みと実行をすることができる。そして、所有者は書き込むことも可能である。
ディレクトリの場合、許可の意味がファイルとは少し異なる。まず、読み取り許可はディレクトリの内容を読み取れるかどうかという意味になる。ディレクトリの読み取り許可がないと、ディレクトリに格納されているファイル名を読み取れなくなる。次に、書き込み許可は、ディレクトリ内容を変更できるかどうかという意味になる。書き込み許可がないと、ディレクトリに変更を加えることができない。つまり、ファイルの追加や削除、更新ができなくなる。
そして、実行許可は、そのディレクトリより先に進めるかどうかという意味になる。実行許可がないと、そのディレクトリに含まれているファイルにアクセスできなくなる。
(中野 賢)
ファイルとディレクトリの属性の変更
ファイルやディレクトリのパーミッションを変更するには、chmodコマンドを用いる。
パーミッションは、読み取り、書き込み、実行の3組を所有者、グループ、その他のユーザーに対してそれ
ぞれ設定する。この指定の方法には記号モードと数値モードの
2通りがある。
たとえば記号モードでは、次のように指定する。
最初のugoは、所有者(user)、グループ(group)、その他(other)に対しての操作であることを指定している。次のプラス記号で許可を与えている。その許可は、読み取り(read)、書き込み(write)、実行(execute)である。
許可をしないようにするにはプラスの代わりにマイナスを指定する。たとえば、その他のユーザー(other)に対して書き込み(write)できないようにするには、次のようにする。
数値モードは、最初は難しく感じるかもしれないが、慣れると非常に使いやすい。このモードでは、それぞれの許可の設定を以下に示す値の合計で指定する。
- 400 所有者の読み取り
- 200 所有者の書き込み
- 100 所有者の実行
- 40 グループの読み取り
- 20 グループの書き込み
- 10 グループの実行
- 4 その他の読み取り
- 2 その他の書き込み
- 1 その他の実行
たとえば、所有者とグループに対して読み取りと書き込み、その他のユーザーへは読み取りだけの許可となるようにするには、次のようにする。
所有者だけに読み取りと書き込み、グループとその他は読み取りだけにするには、644となる。所有者だけがフルコントロール、グループとその他は何もなしならば700だ。
ディレクトリに含まれるファイルのパーミッションをすべて変更したい場合は、Rオプションを指定する。
ただし、このときにファイルの実行フラグを取ろうとして、
のようにしてしまうと、サブディレクトリの実行許可もなくなってしまう。ディレクトリはそのままで、通常のファイルだけ実行許可を変更したい場合は、次のようにする。
USER$ find . -type f -exec chmod go-x {} \;
|
グループの変更は、chgrpコマンドで行う。ただし、新しく設定するグループのメンバーでなければならない。
自分が属しているグループはgroupsコマンドでわかる。
この例でのユーザーであれば、グループをusersかrootに変更することが可能だ(画面1)。
USER$ ls -l linux.txt
-r--r--r-- 1 ken-na users 15097 Mar 19 18:56 linux.txt
USER$ chgrp root linux.txt
USER$ ls -l linux.txt
-r--r--r-- 1 ken-na root 15097 Mar 19 18:56 linux.txt
| 画面1 ファイルのグループを変更する |
ディレクトリに含まれるファイルのグループをすべて変更したい場合は、chmodと同じようにRオプションを指定する。
ファイルの所有者の変更は、chownコマンドで行う。ただし、スーパーユーザーだけが変更できる。それ以外のユーザーは変更できないことに注意する(画面2)。
root# ls -l linux.txt
-r--r--r-- 1 ken-na root 15097 Mar 19 18:56 linux.txt
root# chown www linux.txt
root# ls -l linux.txt
-r--r--r-- 1 www root 15097 Mar 19 18:56 linux.txt
| 画面2 ファイルの所有者を変更する |
chownもRオプションで再帰的に所有者を変更できる。
(中野 賢)
ディレクトリの作成と削除
ディレクトリの作成はmkdirコマンドで行う。引数には作成するディレクトリ名を指定する。
USER$ mkdir linux
USER$ mkdir linux/doc
|
パスを指定してディレクトリを作るときには、上位のディレクトリがすでに存在している必要があることに注意が必要だ。指定したパスに存在していないディレクトリ名が含まれているとエラーになる。
ディレクトリを削除するにはrmdirコマンドを使う。
USER$ rmdir linux/doc
USER$ rmdir linux
|
ただし、ディレクトリが削除されるのは、ディレクトリの内容が空になっているときだけである。つまり、指定したディレクトリの中にファイルやサブディレクトリがあると、ディレクトリは削除されない。
ファイルやサブディレクトリの有無に関わらず、ディレクトリを丸ごと削除するには、あとで説明をするrmコマンドを使う。
(中野 賢)
ファイルとディレクトリのコピー
ファイルをコピーするには、cpコマンドを用いる。
USER$
cp linux.txt linux-mag.txt
|
最初の引数にはコピー元となるファイル名、次にコピー先のファイル名を指定する。コピー先のファイルがすでに存在していると、そのファイルの内容はコピー元の内容に上書きされるので注意をしよう。
iオプションを指定すると、コピー先に指定をしたファイルがすでに存在していると、そのファイルを上書きしてもよいかどうかの確認メッセージが表示される。
USER$ cp -i linux.txt linux-mag.txt
cp: overwrite `linux-mag.txt'?
|
ここで“n”と答えるとコピーされない。“y”と答えればもちろん上書きされる。
コピー先はファイル名でなく、ディレクトリ名でもかまわない。この場合は、指定したディレクトリの中に、コピーするファイルが元と同じ名前で作られる。
USER$ cp linux.txt backup
USER$ ls backup
linux.txt
|
rオプションを指定すると、コピー元にもディレクトリを指定できる。このオプションはサブディレクトリに対しても処理を行うという意味を持っている。
cpコマンドでコピーされたファイルは、作成された日付となり、パーミッションもそのディレクトリにあわせて設定される。これらの情報もコピーしたい場合は、pオプションを指定する。
(中野 賢)
ファイルとディレクトリの削除
ファイルの削除は、rmコマンドで行う。削除したいファイルを引数に指定する。
指定されたファイルの存在するディレクトリに書き込み許可がないと削除できない。ディレクトリ内容の変更ができないためだ。この場合は、chmodコマンドで、ディレクトリに書き込み許可を追加してから削除する。
また、ディレクトリに書き込み許可があっても、削除するファイルに書き込み許可がないと、削除するかどうかの確認メッセージを出力する。fオプションを指定すると、書き込み許可に関わらず、確認メッセージを出さないようになる。
逆に、書き込み許可があっても確認メッセージを出力したい場合は、iオプションを指定すれば、個々のファイルに対して削除するかどうかを聞かれる。
USER$ rm -i *
rm: remove `sample.aux'?
|
しかし、慣れてきたり、答える回数が多くなると、勢いで“y”を押してしまうこともある。できれば、rmコマンドを実行する前に、lsコマンドで同じ指定をして一致するファイルを確認するほうがよいだろう。
rmコマンドにも、rオプションがある。意味はcpと同じだ。ディレクトリに対して再帰的に操作を繰り返す。
先に説明をしたrmdirコマンドは、対象ディレクトリ内にファイルやサブディレクトリがある場合、ディレクトリを削除しない。しかし、rmコマンドではファイルもサブディレクトリも削除する。そのため、rオプションを使う場面では、特に気をつけて使おう。
(中野 賢)
ファイルとディレクトリの移動(名前の変更)
ファイルの名前を変更するのには、mvコマンドを使う。最初の引数には元の名前、2番目の引数に新しい名前を指定する。
USER$ ls -F
linux.doc
USER$ mv linux.txt linux.doc
USER$ ls -F
linux.doc
|
mvはファイルを別のディレクトリに移動するのにも使える。
USER$ ls -F
linux.doc mag/
USER$ mv linux.doc mag
USER$ ls -F
mag/
USER$ ls -F mag
linux.doc
|
そして、ディレクトリに対しても同様に行うことができる。
mvは、ディスク上のファイルのデータ内容を移動しているのではなく、ディレクトリが保持しているファイル名のデータを書き換えているだけである。そのため、mvを実行するには、移動元ファイルのあるディレクトリと移動先のディレクトリの両方に書き込み許可が与えられていなければならない。
(中野 賢)
|