Daily ASCII Linux

All ASCII Linux Issue / Linux Magazine 2000年5月号

覚えておきたい必須コマンド30―その1・ファイルの基本操作

Linux操作の基本、ファイルやディレクトリ操作をコマンドでできるようになろう。


2001年5月31日

はじめに

Linux magazine logo


Linux magazine 5月号表紙
本記事も収録 Linux magazine 2000年 5月号 1,390円
Windowsを使ううえでコマンド画面を使うことはそう多くないだろう。DOSの時代を経験したユーザーなら、WindowsのいわゆるDOS窓を使いこなしているかもしれないが、最近PCを使うようになったユーザーはまず使わない。Macintoshにいたっては、コマンド画面そのものがないのだ。
一方、LinuxやUNIXではコマンドを多用することが多い。このご時世になんて前時代的なと思うなかれ、UNIXの世界にはDOS環境のCOMMAND.COMなどとは比較にならないほど高機能なシェル、そして、ひとつひとつは単純な機能しか持たないが、組み合わせることで強大な力を発揮する数々のコマンドが用意されている。これらを使いこなせば、GUIでは絶対にできないオペレーションも可能になる。
しかし、そのためにはまず個々のコマンドを知らなければならない。そこで、本特集では使用頻度が高いコマンドを中心に基本的な使い方を解説しよう。
これを読めばあなたはもうコマンドの使い手だ。


(中野 賢)


ディレクトリ位置の確認

コンソールから、ユーザー名とパスワードを入力しログインすると、


USER$

のようなプロンプトが表示される。

この状態では、ユーザーはホームディレクトリ(ログインディレクトリ)にいる。そして、現在、ユーザーのいるディレクトリのことをカレントディレクトリ(作業ディレクトリ)と呼ぶ。つまり、ログインした直後の状態では、ホームディレクトリがカレントディレクトリである。

カレントディレクトリの位置を確認するには、pwdコマンドを実行する。コマンドラインから、


USER$ pwd

とするだけだ。すると、


/home/ken-na

のように現在のディレクトリ位置が表示される。ログインした直後では、自分のホームディレクトリがカレントディレクトリになっている。

Linuxシステムは、図1のような木構造のディレクトリの上に構築されている。このうち、最上位のディレクトリは根っ子という意味でルートディレクトリと呼ばれる。すべてのディレクトリはここから始まる。

図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ディレクトリに移動したいときは、次のようにする。



USER$ cd /usr

実行すると、カレントディレクトリが/usrディレクトリに移動しているはずだ。pwdコマンドで確認してみよう。


USER$ pwd
/usr

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つのドット(..)がある。「.」はカレントディレクトリを指し、「..」は親ディレクトリを指している。したがって、


USER$ cd .

は、カレントディレクトリへの移動を実行している。もちろん、ディレクトリ位置は変わらない。


USER$ cd ..

とすれば、親ディレクトリに移動する。pwdコマンドを実行してみよう。


USER$ pwd
/home

カレントディレクトリが/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上から、


USER$ cd /tmp

として、/tmpディレクトリに移動後、


USER$ kterm &

として起動すると、その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)。

図2
lsの詳細表示

lオプションでは、ファイルの種類と許可、リンク数またはディレクトリ数、所有者、グループ、ファイルサイズ、最終修正時刻、名前が出力されている。

ファイルの種類は、通常のファイル(-)、ディレクトリ(d)、シンボリックリンク(l)、デバイスファイル(bまたはc)が区別される。

許可はパーミッションとも呼ばれ、所有者、グループ、その他のユーザーに対して、それぞれ読み取り、書き込み、実行の許可の有無を示している。たとえば、


rw-rw-r--

のようになっているファイルは、所有者とグループは読み込みと書き込みができるが、その他のユーザーは読み込みしかできないことを意味している。


rwxr-xr-x

は、すべてのユーザーが読み込みと実行をすることができる。そして、所有者は書き込むことも可能である。

ディレクトリの場合、許可の意味がファイルとは少し異なる。まず、読み取り許可はディレクトリの内容を読み取れるかどうかという意味になる。ディレクトリの読み取り許可がないと、ディレクトリに格納されているファイル名を読み取れなくなる。次に、書き込み許可は、ディレクトリ内容を変更できるかどうかという意味になる。書き込み許可がないと、ディレクトリに変更を加えることができない。つまり、ファイルの追加や削除、更新ができなくなる。

そして、実行許可は、そのディレクトリより先に進めるかどうかという意味になる。実行許可がないと、そのディレクトリに含まれているファイルにアクセスできなくなる。

(中野 賢)


ファイルとディレクトリの属性の変更

ファイルやディレクトリのパーミッションを変更するには、chmodコマンドを用いる。

パーミッションは、読み取り、書き込み、実行の3組を所有者、グループ、その他のユーザーに対してそれ ぞれ設定する。この指定の方法には記号モードと数値モードの 2通りがある。

たとえば記号モードでは、次のように指定する。


USER$ chmod ugo+rwx fuga

最初のugoは、所有者(user)、グループ(group)、その他(other)に対しての操作であることを指定している。次のプラス記号で許可を与えている。その許可は、読み取り(read)、書き込み(write)、実行(execute)である。

許可をしないようにするにはプラスの代わりにマイナスを指定する。たとえば、その他のユーザー(other)に対して書き込み(write)できないようにするには、次のようにする。


USER$ chmod o-w fuga

数値モードは、最初は難しく感じるかもしれないが、慣れると非常に使いやすい。このモードでは、それぞれの許可の設定を以下に示す値の合計で指定する。

  • 400 所有者の読み取り
  • 200 所有者の書き込み
  • 100 所有者の実行
  • 40 グループの読み取り
  • 20 グループの書き込み
  • 10 グループの実行
  • 4 その他の読み取り
  • 2 その他の書き込み
  • 1 その他の実行

たとえば、所有者とグループに対して読み取りと書き込み、その他のユーザーへは読み取りだけの許可となるようにするには、次のようにする。


USER$ chmod 664 fuga

所有者だけに読み取りと書き込み、グループとその他は読み取りだけにするには、644となる。所有者だけがフルコントロール、グループとその他は何もなしならば700だ。

ディレクトリに含まれるファイルのパーミッションをすべて変更したい場合は、Rオプションを指定する。


USER$ chmod -R go-w fuga

ただし、このときにファイルの実行フラグを取ろうとして、


USER$ chmod -R go-x fuga

のようにしてしまうと、サブディレクトリの実行許可もなくなってしまう。ディレクトリはそのままで、通常のファイルだけ実行許可を変更したい場合は、次のようにする。


USER$ find . -type f -exec chmod go-x {} \;

グループの変更は、chgrpコマンドで行う。ただし、新しく設定するグループのメンバーでなければならない。

自分が属しているグループはgroupsコマンドでわかる。


USER$ groups
users root

この例でのユーザーであれば、グループを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オプションを指定すると、コピー元にもディレクトリを指定できる。このオプションはサブディレクトリに対しても処理を行うという意味を持っている。


USER$ cp -r linux Linux

cpコマンドでコピーされたファイルは、作成された日付となり、パーミッションもそのディレクトリにあわせて設定される。これらの情報もコピーしたい場合は、pオプションを指定する。

(中野 賢)


ファイルとディレクトリの削除

ファイルの削除は、rmコマンドで行う。削除したいファイルを引数に指定する。


USER$ rm foo bar

指定されたファイルの存在するディレクトリに書き込み許可がないと削除できない。ディレクトリ内容の変更ができないためだ。この場合は、chmodコマンドで、ディレクトリに書き込み許可を追加してから削除する。

また、ディレクトリに書き込み許可があっても、削除するファイルに書き込み許可がないと、削除するかどうかの確認メッセージを出力する。fオプションを指定すると、書き込み許可に関わらず、確認メッセージを出さないようになる。


USER$ rm -f filename

逆に、書き込み許可があっても確認メッセージを出力したい場合は、iオプションを指定すれば、個々のファイルに対して削除するかどうかを聞かれる。


USER$ rm -i *
rm: remove `sample.aux'?

しかし、慣れてきたり、答える回数が多くなると、勢いで“y”を押してしまうこともある。できれば、rmコマンドを実行する前に、lsコマンドで同じ指定をして一致するファイルを確認するほうがよいだろう。

rmコマンドにも、rオプションがある。意味はcpと同じだ。ディレクトリに対して再帰的に操作を繰り返す。


USER$ rm -r directory

先に説明をした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を実行するには、移動元ファイルのあるディレクトリと移動先のディレクトリの両方に書き込み許可が与えられていなければならない。

(中野 賢)




[通常ページに戻る]
ASCII24 http://ascii24.com/
Copyright (C)1999-2006 ASCII Corporation. All rights reserved.