Chapter 2

コマンドを実行して,ファイルを操作する

目次

目標

  1. ファイルの作り方,使い方を知る
  2. コマンドの実行方法を知る
  3. ディレクトリやパーミッションを用いた,ファイルの管理方法について知る

2.1 ファイルについて

2.1.1 ファイルとファイル名

コンピュータのデータには,ワープロで作成した文書やデジカメで撮影した画像など,さまざまなものがあります.これらのデータはファイルとして,コンピュータの外部記憶装置(ハードディスクなど)に記録されます.しかし,文書であれ画像であれ,コンピュータのデータであれば0と1の2進数で表されたデジタルデータなので,外部記憶装置に記録する際に一つ一つのデータを区別しておかないと,データが混ざってあとで取り出せなくなってしまいます.

そこで,ひとつのデータごとに外部記憶装置上の一定の領域を割り当て,それに名前をつけることによって,データを管理できるようにします.このように,名前をつけたデータのひと塊のことをファイルと呼び,その名前のことをファイル名と言います.

外部記憶装置とファイル名

2.1.2 ファイル名に使える文字

UnixやLinuxのファイル名には,英字数字ハイフン(-),アンダースコア(_),それにピリオド(.) が使えます.コンマ(,)や+%もたいてい問題なく使えると思います.英字の大文字と小文字は区別されます.これら以外の記号文字には特別な機能が与えられている場合があるため,使えないか,使えたとしてもとても面倒なことになるので,使わないほうが無難です.日本語の文字もファイル名に使えます.

ファイル名に使える文字
アルファベット AZ, az
数字 09
ハイフン(マイナス) -
アンダースコア(下線) _
ピリオド .
そのほか +,%,#,@,チルダ(~),コロン(:),コンマ(,)

ただし,シャープ(#,「ナンバーサイン」とも呼ばれます),チルダ(~),コンマ(,)などは,アプリケーションソフトウェアによって特別な意味が与えられている場合があります.またハイフン(-)とピリオド(.)は,ファイル名の中で使う位置に注意が必要です.

ハイフン(-)
ファイル名の先頭にハイフン(-)があると,コマンドのオプション(後述)と区別しにくくなります.
ピリオド(.)
ファイル名の先頭にピリオド(.)があると,そのファイル名はファイル名の一覧から隠されますピリオドから始まるファイル名は,アプリケーションソフトウェアの設定ファイルなど,通常は一覧表示に含める必要がないファイルで使われます.

ファイル名の長さは255文字まで(日本語の場合は127文字まで)です.

2.1.3 サフィックス(拡張子)*

ファイル名の末尾の,ピリオド(.)に続いた部分は,ファイル名のサフィックスとして利用さ れる場合があります.サフィックスは通常そのファイルの種類を示し,アプリケーションソフトウェアがそのファイルの取り扱い方法を判断するのに利用します.Windows では「拡張子(かくちょうし)」と呼ばれます.ただし,Unix や Linux においてサフィックスの取り扱いは Windows ほど厳密ではなく,サフィックスを持たないファイルも存在します.

サフィックス(拡張子)の例
テキストファイル .txt (例 report.txt, readme.txt)
TeX ソースファイル .tex (例 paper.tex, article.tex)
C 言語ソースファイル .c (例 prog.c, main.c)
C++ 言語ソースファイル .cc .c++ .cpp (例 prog.cc, main.c++)
オブジェクトファイル .o (例 prog.o, main.o)
PostScript ファイル .ps (例 paper.ps, figure.ps)
EPS ファイル .eps .epsf (例 paper.eps, figure.eps)
JPEG 画像ファイル .jpg .jpeg .jfif (例 photo.jpg)
GIF 画像ファイル .gif (例 fig1.gif)
PNG 画像ファイル .png (例 button.png)
Tgif 図形ファイル .obj (例 figure.obj)
HTML ファイル .html .htm (例 index.html)
VRML 図形ファイル .wrl .vrml (例 dango.wrl)

テキストファイル文字だけからなるデータです.その他については後に必要に応じて解説します.

2.1.4 ファイルマネージャ*

このようにファイルは,本来データの集まりに名前を付けたものに過ぎず,目に見えるような形を持ったものではありません. しかし,それでは,特にコンピュータに関する知識をあまり持っていない人にとって,とっつきにくいものになってしまいます. そこで,このファイルに対して目に見える仮の姿を与えることがよく行われます. GNOME では,これにファイルマネージャ というアプリケーションソフトウェアを用います. なお,このようにコンピュータの操作に視覚的な表現を用いる場合を,グラフィカルユーザインタフェース (GUI) と言います.

ファイルマネージャのウィンドウは,パネルにある家のアイコンをクリックするか,背景のところにある「(自分のユーザ名)のホーム」のアイコンをダブルクリックすることで,開きます.

ホームディレクトリを開く

起動すると,あなたがホームディレクトリにあるファイルやディレクトリの内容が表示されます.ファイルのアイコンをダブルクリックすると,その中身が表示されます.ディレクトリ(フォルダ)のアイコンをダブルクリックすると,そのディレクトリの中にあるファイルを見ることができます.

ファイルマネージャ

2.2 コマンド

2.2.1 シェルを起動する

グラフィカルユーザインタフェースを使えば,ファイルやプログラムの操作を直観的に行うことができます. しかし,このグラフィカルユーザインタフェースを実現するにもプログラミングなどの作業が必要であり,その際にはこういったグラフィカルユーザインタフェースが用意されていない場合があります(無いから作ろうってんだから…). したがって,ソフトウェア開発の現場では(かなり整備されてきているとは言え),今でも文字主体の 操作環境を利用する場合があります(というか,グラフィカルなソフトウェアの開発環境はプロの開発者にはとても便利ですが,機能が豊富な分,初心者にとって理解しやすいとはあまり思えない). また,コンピュータの「動作」を理解するうえでも,この文字主体のシンプルな操作環境は有効だと考えています.この文字主体の操作環境の中心となるものが,シェルというプログラムです.

シェルはターミナル (gnome-terminal) を起動すると,自動的に起動します.それではターミナルのウィンドウを開いてください.

ターミナル
シェルとは

シェルとは利用者の命令をコンピュータ(オペレーティングシステム)に伝達するインタプリタと呼ばれる種類のソフトウェアで,利用者からコマンド(命令)が与えられるのを待っています. 現在使用しているシェルは bash(Bourne Again シェル)というものです.このようなソフトウェアには,他に sh,csh,tcsh,ksh,zshなどがあります.

bash-2.05b$”という表示はプロンプト(入力促進符号)と呼ばれ,bash がコマンド待ち状態であることを示しています.プロンプトとして用いる文字列は変更可能です.

以降ではこのプロンプトを "$" 1個で表します.

このターミナルは仮想端末と呼ばれるソフトウェアで,このウィンドウひとつが1台の端末装置のように振舞います. ターミナルを複数動かせば,それぞれのウィンドウで別々の仕事をすることができます. このような仮想端末プログラムには,gnome-terminalの他に X Window System 標準の xterm,xterm を日本語化した kterm,xtermを「軽量化」した rxvt,背景に画像を仕込める Eterm など,さまざまなものがあります.

シェルはオペレーティングシステムユーザインタフェースとして働きます. 利用者はシェルを通じてコンピュータを操作します.

仮想端末とオペレーティングシステム

2.2.2 コマンドを実行する

シェルに対して次の操作(右側の欄の網掛け部分)を行ってください. なお,$プロンプトを示します.

コマンドの実行
キーボードから date とタイプし,[Enter]をタイプする.コマンドは[Enter]キーをタイプすることによって実行を開始する.date は現在時刻を出力するコマンド.
$ date[Enter]  ↓実行結果(出力)
2008年  8月  4日 月曜日 14:05:58 JST
$ ←次のコマンド待ち状態
存在しないコマンドを実行するとエラーになる.abcdef というコマンドは存在しない
$ abcdef[Enter]  ↓これはエラーメッセージ
abcdef: コマンドが見つかりません.
$ ←次のコマンド待ち状態

コマンドにオプションを付けて実行することで, その動作を変えることができる場合があります.

コマンドのオプション
date の "-u" は協定世界時で出力するオプション.コマンドとオプションの間は空白をあける(続けると "date-u"という別のコマンドだと解釈されてしまう).
$ date -u[Enter] ↓協定世界時になる
2008年  8月  7日 月曜日 05:06:03 UTC
$

コマンドの実行に必要な情報を,引数(ひきすう)で与える場合もあります.

コマンドの引数
cal コマンドを引数なしで実行すると今月のカレンダーを表示する.
$ cal[Enter]
      8月 2008
日 月 火 水 木 金 土 
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
$
コマンドには引数を付けることができるものがある.引数はコマンドの実行に必要な情報を与えるときなどに使う.cal コマンドの引数に月と年を与えて実行する.
$ cal 9 2008[Enter]
      9月 2008
日 月 火 水 木 金 土 
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
$
ここまでで出てきたコマンド
date
現在時刻を出力します.
cal
カレンダーを出力します.

2.2.3 コマンドの出力をファイルに保存する

コマンドは標準出力と呼ばれる出口に出力を送ります. 標準出力は通常,端末装置につながっているので,この出力は画面(仮想端末のウィンドウ)に表示されます. ">" という文字を使えば,これを切り替えて出力をファイルに保存することができます. この操作を標準出力のリダイレクトといいます.

コマンドの出力データをファイルに保存する
date コマンドを実行し, 出力を a というファイルに保存する.出力はファイル a に入るため,画面には表示されない.
$ date > a[Enter]
        ←何も出力されない
cal コマンドを実行し, 出力を b というファイルに保存する.これも出力がファイル b に入るため,画面には表示されない.
$ cal > b[Enter]
        ←何も出力されない
ls コマンドを実行する. a と b という2つのファイルができている.ls は現在所有しているファイル名をリストアップする.
$ ls[Enter]
〜 a 〜 b 〜 ←持っているファイル
a というファイルの内容を出力.
$ cat a[Enter]
2008年  8月  4日 月曜日 14:12:21 JST
b というファイルの内容を出力.cat は引数に指定したファイルの内容を出力するコマンド.
$ cat b[Enter]
      8月 2008
日 月 火 水 木 金 土 
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

">" の代りに ">>" を使えば,既にあるファイルの後ろに別のファイルの内容を追加することができます.

コマンドの出力データをファイルに追加する
ファイル a の内容を確認してみる.
$ cat a[Enter]
2008年  8月  4日 月曜日 14:12:21 JST
">" の代りに ">>" って a に入れる.
$ date >> a[Enter]
もう一度ファイル a の内容を確認してみる.それまでの内容の後ろに新しい内容が追加されている.
$ cat a[Enter]
2008年  8月  4日 月曜日 14:12:21 JST
2008年  8月  4日 月曜日 14:17:44 JST
標準出力のリダイレクト
「>」という記号の役割
「>」という文字は,コマンドの出力データを画面に表示する代りに,その右側に書かれたファイルに保存します.それまでそのファイルの中に入っていた内容は失われます.
「>>」という記号の役割
「>>」はコマンドの出力データを既にファイルの中に入っている内容の後ろに追加します.
標準出力のリダイレクト

cat もコマンドですから,この標準出力を別のファイルにリダイレクトできます.cat コマンドは引数に指定したファイルをそのまま出力しますから,ファイルのコピーができます.

cat を使ったファイルのコピー
ファイル b の内容を確認してみる.カレンダーが入っているはず.
$ cat b[Enter]
      8月 2008
日 月 火 水 木 金 土 
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
ファイル a の内容を画面に出力する代りに, ファイル b に入れる.
$ cat a > b[Enter]
それまでのファイル b の内容(カレンダ)は失われ, 代りに a と同じ内容が入っている (ファイルのコピー).
$ cat a[Enter]
2008年  8月  4日 月曜日 14:12:21 JST
2008年  8月  4日 月曜日 14:17:44 JST
$ cat b[Enter]
2008年  8月  4日 月曜日 14:12:21 JST
2008年  8月  4日 月曜日 14:17:44 JST

cat の引数のファイル名を省略すると,キーボードからタイプした文字が出力されます.これと標準出力のリダイレクトを組み合わせれば,テキストファイルが作成できます.網掛け部分をタイプしてください.

cat を使ったテキストファイルの作成
引数を付けずに cat コマンドを実行すると,プロンプトも出ずにとまったように見える.これは cat がキーボードからの入力を待っている
$ cat[Enter]
              ←何も出力されない
とりあえず何かタイプして [Enter] してみる.タイプしたものがそのまま出力される.
$ cat
How are you?[Enter] ←キーボードから入力する
How are you? ←こっちは cat コマンドの出力
Ctrl-D をタイプすると,再びシェルのプロンプトが現れる.Ctrl-D入力の終了を意味する.
$ cat
How are you?
How are you?
Ctrl-D ←入力の終了
$ ←シェルのプロンプトが現れる
cat の出力を c にリダイレクトする.この場合,キーボードからタイプしたものはファイル c に入るので画面には出力されない.
$ cat > c[Enter]
Fine, thank you.[Enter] ←キーボードから入力する
              ←何も出力されない
Ctrl-D をタイプしてキーボードからの入力を終了する.
$ cat > c
Fine, thank you.
Ctrl-D ←入力の終了
$
ファイル c の内容を見てみる(">" を使わないことに注意).さっきタイプしたものが入っている.
$ cat c[Enter]
Fine, thank you.
ここまでで出てきたコマンド
ls
ファイル名の一覧を表示します (list).
cat
ファイルの中身を表示します.このコマンドは引数に複数のファイルを指定でき,それらを連結 (concatenete) して出力します.

2.3 ファイルの操作

2.3.1 ファイルをコピーする

既に存在するファイルと同じ内容のファイルを作成する(ファイルのコピー)には,cp コマンドを使います.「CoPy の cp」と覚えましょう.

シェルに対して次の操作(右側の欄の網掛け部分)を行ってください. なお,$プロンプトを示します.

cp 〜ファイルのコピー
ファイル a を作る.
$ date > a[Enter]
a をコピーして b という別のファイルを作る.すでに b が存在した場合,その内容は失われる.
$ cp a b[Enter]
a と b の中身を見てみる.内容は同じ.
$ cat a[Enter]
2008年  8月  4日 月曜日 14:35:05 JST
$ cat b[Enter]
2008年  8月  4日 月曜日 14:35:05 JST
↑b は a と同じ内容

2.3.2 ファイル名を変更する

ファイル名の変更には mv コマンドを使います. 「mv」は「MoVe (移動する)」にちなんだコマンド名です. 「a を b に移動する」が,ファイル操作では, 「a というファイル名を b にする」になります.中身は変わりません.

mv 〜ファイルの移動(名前の変更)
a,b という2つのファイルがあるとする(上で作ったのであるはず).
$ ls[Enter]
〜 a 〜 b 〜
a を x に移動する.a がなくなり,x ができる.
$ mv a x[Enter]
$ ls[Enter]
〜 b 〜 x 〜 ←a が無くなり x ができる
b を x に移動する.それまで x に入っていた内容(a の内容)は失われる.
$ mv b x[Enter]
$ ls[Enter]
〜 x 〜      ←b が無くなる

2.3.3 ファイルを削除する

不要なファイルを削除するには,rm コマンドを使います. これは「ReMove」です.

rm 〜ファイルの削除
ファイル x を削除する.
$ rm x[Enter]
複数のファイルを指定しても良い.
$ rm a b[Enter]
ここまでで出てきたコマンド
cp
ファイルをコピーします(同じ内容の別のファイルを作ります).
mv
ファイルの名前を変えたり,移動したりします.
rm
ファイルを削除します.

2 3.4 ワイルドカード*

"*"や"?" などの特殊文字を使ってファイル名のパターンを表して,複数のファイルを一括して指定することができます.このような文字はワイルドカードと呼ばれます.

ワイルドカードに使われる文字
任意の文字列にマッチする *
任意の1文字にマッチする ?
いずれか1文字にマッチする [ ]
パターンの例
a*
a から始まるファイル名のパターン
a*c
先頭が a で末尾が c のファイル名のパターン
???
3文字のファイル名のパターン
d[135]
d1,d3,d5 の3つのファイルのパターン
[a-z]*
先頭が小文字のファイル名のパターン
[^0-9]*
先頭が数字ではないファイル名のパターン
ワイルドカードの使用例
a で始まるファイルの詳細を表示する. ls コマンドの -l オプションは詳細表示.
$ ls -l a*[Enter]
末尾が ".doc" のファイルを連結して表示する.
$ cat *.doc[Enter]
d1.bak,d2.bak,d3.bak の3つのファイルを削除する.
$ rm d[1-3].bak[Enter]

2.4 ディレクトリ

2.4.1 ディレクトリ木

コンピュータのファイルを保存したり管理したりするためのメカニズムのことを,ファイルシステムと呼びます. このコンピュータのファイルシステムには非常にたくさんのファイルが保存されています. もし仮にそれらが同じ場所にあったとすると,目的のファイルを見つけるのがかなり大変になります. また他人と同じファイル名を付けないようにも気をつけなければならず,とっても面倒なことになります.

そこで,これらのファイルを用途所有者ごとに分類・整理して保存するために,Unix や Linux(や,近代的なオペレーティングシステムのほとんど)のファイルシステムは下図のような木構造(ツリー構造)になっています. 下の図の「スタート」をクリックしてください. 下の図を見ることができない人は,Flash プラグインが使えないかもしれません.GIF 画像による解説をご覧ください.

この木はひっくり返ったようになっていて,一番根本がてっぺんにあります.てっぺんのディレクトリ "/" は ルートディレクトリと呼び, ファイルシステムの起点になります. その下に bin,etc,usr などのサブディレクトリがあり,usr の下にもさらに bin,etc,local などのサブディレクトリがあります.

2.4.2 カレントディレクトリを知る

ターミナルで pwd コマンドを実行すれば,そのターミナル内で動いているシェルのカレントディレクトリ (current directory)を表示します. カレントディレクトリとは,シェルが現在,処理の対象としているディレクトリのことで,作業ディレクトリ (working directory)とも呼ばれます. 「現在」と書いていることから想像できるように,必要に応じて,カレントディレクトリを変更することができます.

pwd 〜カレントディレクトリの表示
カレントディレクトリを表示する.たぶんホームディレクトリが表示されるはず."s095000"はあなたのユーザ名だと思ってください.
$ pwd[Enter]
/home/sys/s095000 ←カレントディレクトリ

ターミナルを開いた直後のディレクトリは, そのコンピュータにログインした利用者が所有するディレクトリで, ホームディレクトリと呼びます.利用者のファイルは原則としてこのホームディレクトリ以下に置かれます.

ディレクトリの階層は "/" で区切ります.

ひとつのファイルやディレクトリを表すとき,二つの方法があります. ルートディレクトリを起点にしたパス(経路)で表す場合を,絶対パスと呼びます. カレントディレクトリを起点にしたパスで表す場合は,相対パスと呼びます. 上図の Desktop というディレクトリは, 絶対パスだと /home/sys/s095000/Desktop と表されますが, /home というディレクトリからの相対パスで表せば sys/s095000/Desktopとなります.

そのほかのほとんどのディレクトリは,他人のホームディレクトリを含めて, 利用者が勝手にファイルを作成したりすることはできないようになっています. 例外的に /tmp などは誰でもファイルを置くことができますが, このディレクトリに置いたファイルは, コンピュータの電源を切ると無くなってしまう場合があります.

ホームディレクトリというのはUnixやLinuxに特有の概念ではなく,Windowsにも存在します. 演習室のコンピュータを Windows XP で起動したとき,ホームディレクトリは H: ドライブになります.

なお,このコンピュータの /home/sys や /home/staff などは, 実際には目の前にあるコンピュータ(ワークステーション)ではなく,サーバと呼ばれる別のコンピュータ上にあり,LANを使って共有しています.

2.4.3 カレントディレクトリを変更する

それでは,カレントディレクトリを変更(移動)してみましょう. カレントディレクトリを変更するにはcd コマンドを使います. 下の図の「スタート」をクリックしてください. 下の図を見ることができない人は,Flash プラグインが使えないかもしれません. GIF 画像による解説をご覧ください.

シェルに対して次の操作(右側の欄の網掛け部分)を行ってください.なお,$プロンプトを示します.

cd 〜カレントディレクトリの移動
カレントディレクトリを表示する.たぶんホームディレクトリが表示されるはず."s095000"はあなたのユーザ名だと思ってください.
$ pwd[Enter]
/home/sys/s095000
ひとつ上のディレクトリに移動する.".." はひとつ上のディレクトリ(親ディレクトリ)を示す.このディレクトリには自分のホームディレクトリ "s095000" が含まれる.
$ cd ..[Enter] ←ひとつ上に上がる
$ pwd[Enter]
/home/sys
カレントディレクトリにある "s095000" というディレクトリに移動する.ホームディレクトリに戻る.
$ cd s095000[Enter] ←ひとつ下に降りる
$ pwd[Enter]
/home/sys/s095000
ルートディレクトリに移動する."/" はルートディレクトリを示す.
$ cd /[Enter] ←ルートディレクトリ
$ ls[Enter]
bin boot etc 〜 tmp usr
カレントディレクトリ内にあるディレクトリ tmp に移動する.カレントディレクトリを起点にしたディレクトリの指定を相対パスと呼ぶ.
$ cd tmp[Enter] ←相対パス
$ pwd[Enter]
/tmp
ディレクトリの指定が "/" で始まっていれば,これはルートディレクトリを起点にした指定になる.これを絶対パスと呼ぶ.
$ cd /usr/bin[Enter] ←絶対パス
$ pwd[Enter]
/usr/bin
cd コマンドに引数を指定しなければホームディレクトリに戻る.
$ cd[Enter] ←引数なし
$ pwd[Enter]
/home/sys/s095000 ←ホームディレクトリ

"."(ピリオド1個)のディレクトリはカレントディレクトリを表します. また ".."(ピリオド2個)のディレクトリはカレントディレクトリの親ディレクトリ(ひとつ上のディレクトリ)を示します. カレントディレクトリがホームディレクトリ(上図では /home/sys/s095000) にあるとき,.. は /home/sys,../.. は /home,../../staff は /home/staff になります.

ルートディレクトリの親ディレクトリは,ルートディレクトリです. これは一般の木構造と異なるところです. 一般の木構造(有向木)では,親を持たない要素がちょうど一つあって,それがルートと呼ばれます.

もうひとつ余談ですが,木構造のルートは root と綴ります. 日本語に訳すと,「根」です. 数学の平方根も,square root です. でも,国道などの「ルート」は,route と綴ります.

2.4.4 ディレクトリを作成する

ホームディレクトリ内には,自分でディレクトリ(サブディレクトリ)を作成できます.ディレクトリの作成には mkdir コマンドを使います.

mkdir 〜ディレクトリの作成
3つのファイル a, b, c を作る(内容は空).touch はファイルの修正日時を現在時刻(コマンド実行時の時刻)に変更するコマンド. 引数に指定したファイルが存在しなければ空のファイルを作る.
$ touch a b c[Enter]
$ ls[Enter]
〜 a 〜 b 〜 c  〜
mkdir でカレントディレクトリに d というディレクトリを作る.その後,ファイルの一覧を見てみる.
$ mkdir d[Enter]
$ ls[Enter]
〜 a 〜 b 〜 c 〜 d 〜 ← d ができる
ls コマンドに -F オプションを付けると, ファイルの種類が分かる(後ろに "/" が付いていればディレクトリ).
$ ls -F[Enter]
〜 a 〜 b 〜 c  〜 d/ 〜
   d はディレクトリ↑
ls の引数に普通のファイルを指定すると,そのファイルが(あれば)表示される.

ls の引数にディレクトリを指定すると, そのディレクトリの中にあるファイルの一覧が表示される (d は作ったばかりなので,中身は空).
$ ls a[Enter]
a
$ ls d[Enter]
        ←何も表示されない
d に移動する(カレントディレクトリを移す).ここでファイルの一覧を見る.d は空なのでやはり何も表示されない.
$ cd d[Enter]
$ ls[Enter]
        ←何も表示されない
"." はカレントディレクトリを示す.
$ ls .[Enter]
        ←何も表示されない
".." は上位のディレクトリを示す (但し,"/"(ルートディレクトリ)の .. は "/").
$ ls ..[Enter]
〜 a 〜 b 〜 c 〜 d 〜 ←上のディレクトリが表示される

2.4.5 別のディレクトリにファイルをコピー・移動する

ファイルのコピーやファイル名の変更の際にファイル名にパスを含めれば,ディレクトリをまたがったファイルのコピーや移動ができます.ディレクトリのコピーや移動は,2.4.7 ディレクトリごとコピー・移動・削除するを参照してください.

ディレクトリへの cp/mv
cp コマンドを使ってファイル a をディレクトリ d にコピーする. ディレクトリ d 内に a ができる.
$ cd[Enter] ←ホームディレクトリに戻る
$ cp a d[Enter]
$ ls d[Enter]
a
mv コマンドを使ってファイル b,c をディレクトリ d に移動する. カレントディレクトリから b,c がなくなり, ディレクトリ d 内に b,c ができる.
$ mv b c d[Enter]
$ ls[Enter]
〜 a 〜 d 〜 ←b,c が無い
$ ls d[Enter]
〜 a 〜 b 〜 c 〜 ←b,c はこっちに移った
もちろん,コピー/移動先でのファイル名も指定できる.
$ cp a d/e[Enter]
$ ls d[Enter]
〜 a 〜 b 〜 c 〜 e 〜
$ cat d/a[Enter]
$ cat d/e[Enter]
d/a と d/e の中身は同じはず↑

2.4.6 ディレクトリを削除する

空のディレクトリは,rmdir コマンドで削除できます.

rmdir 〜ディレクトリの削除
ディレクトリ d を削除する. d が空ではないので,削除できない.
$ rmdir d[Enter]
d: ディレクトリが空ではありません ←エラー
ディレクトリ d の中を空にしてから, d を削除する.

a,e は削除する. b,c は一つ上のディレクトリ("..", 親ディレクトリ)に移動する.
$ cd d[Enter]
$ rm a e[Enter]
$ mv b c ..[Enter]
$ ls[Enter]
        ←何も表示されない
$ cd ..[Enter]
$ rmdir d[Enter]
        ←何も表示されない
$ ls[Enter]
〜 a 〜 b 〜 c 〜 ←d が削除された

2.4.7 ディレクトリごとコピー・移動・削除する*

ディレクトリを丸ごとコピーするには,cp コマンドに -r というオプションを付けます.

ディレクトリの移動は,ファイルの操作と同じく,mv コマンドでできます.

ディレクトリ単位のコピー/移動
ディレクトリ d を作り, そこにファイル a,b,c をコピーする.

ディレクトリ d 全体を e というディレクトリにコピーする. この場合,cp コマンドに -r というオプションを付ける.
$ mkdir d[Enter]
$ cp a b c d[Enter]
$ cp -r d e[Enter]
$ ls d e[Enter]
d:
a b c
e:
a b c
↑d と e に同じファイルが入っている
ディレクトリ e を f に移動する. これはディレクトリ名の変更に他ならない.

f を d に移動する. d というディレクトリが既にあるので, f はその中に入る.
$ ls -F[Enter]
〜 a 〜 b 〜 c 〜 d/ 〜 e/ 〜
$ mv e f[Enter]
$ ls -F[Enter]
〜 a 〜 b 〜 c 〜 d/ 〜 f/ 〜
$ mv f d[Enter]
$ ls -F[Enter]
〜 a 〜 b 〜 c 〜 d/ 〜 ←f が無い
$ ls -F d[Enter]
a b c f/ ←こっちに移動した

ディレクトリを中身ごと全部削除するには,rm コマンドに -r オプションを付けてディレクトリを削除してください.

ここまでで出てきたコマンド
pwd
カレントディレクトリを表示します.
cd
カレントディレクトリを移動します.
mkdir
ディレクトリを作成します.
rmdir
ディレクトリを削除します.

2.5 パーミッション

2.5.1 パーミッションとは

パーミッションとは,ファイルを

がそれぞれ を保存しておく情報です.3+3=6種類,ではなく,3×3=9種類の情報を持ちます.

自分一人でファイルを作って操作するなら, パーミッションには特に注意を払わなくてもかまいません. ですが,Webプログラミングをする場合, 自分が作ったファイルやディレクトリが,Webサーバという「他人」から参照できないといけませんし, ファイルによっては実行できないといけないものもあります.

2.5.2 パーミッションを調べる

カレントディレクトリのそれぞれのファイルのパーミッションを調べるには, ls コマンドに,-l オプションをつけて実行します.

ls -l 〜詳細情報つきでファイル情報を見る
パーミッションつきでカレントディレクトリのファイル情報を見る.所有者,グループ,ファイルサイズ(占有バイト数),作成日時もわかる.
$ ls -l[Enter]
〜
-rw-r--r--   1 s095000 students    37 2005-08-04 15:30 a
〜
drwxr-xr-x   2 s095000 students  8096 2005-08-04 15:49 d
〜

「-rw-r--r--」から最初の文字を取り除いた, 「rw-r--r--」が,ファイルaのパーミッション情報です. これを3文字ずつ3つに区切り,「rw-」,「r--」,「r--」と見ます.

「drwxr-xr-x」についても,最初の文字を取り除いた「rwxr-xr-x」を 3文字ずつ3つに区切って,ファイルと同じように読みます.

ls -l を実行したときに出る,ユーザ名の直前の数字は,リンク数と呼ばれます. 気にしないでください.

「37」や「8096」が,ファイルサイズです. 通常のファイルは,中身を変えたらファイルサイズも変わります. ディレクトリのサイズも変わることがありますが,気にすることはありません.

ls -al[Enter]」として実行すると,カレントディレクトリや親ディレクトリのパーミッション情報も知ることができます.

2.5.3 パーミッションを変更する

ファイルやディレクトリのパーミッションを変更するには, chmodコマンドを使います.
chmod 〜パーミッションを変更する
現在のファイルaのパーミッションを確認する.
$ ls -l a[Enter]
-rw-r--r--   1 s095000 students    37 2005-08-04 15:30 a
パーミッションを変更する.
$ chmod 400 a[Enter]
現在のファイルaのパーミッションを確認する.
$ ls -l a[Enter]
-r--------   1 s095000 students    37 2005-08-04 15:30 a
パーミッションを変更する(元に戻す).
$ chmod 644 a[Enter]
自分が所有していないファイル(ディレクトリ)のパーミッションを変更してみると…失敗する.
$ chmod 700 /home[Enter]
chmod: changing permissions of `/home': 許可されていない操作です

chmodコマンドとファイル名の間に,3桁の数字を書きます.それぞれの桁には0〜7の数字を書くことができ,以下の意味になります.

数字2進数の表現ls出力の表現readable?writable?executable?
0000---読めない書ける実行できない
1001--x読めない書けない実行できる
2010-w-読めない書ける実行できない
3011-wx読めない書ける実行できる
4100r--読める書けない実行できない
5101r-x読める書けない実行できる
6110rw-読める書ける実行できない
7111rwx読める書ける実行できる

3桁の数字の最初は「自分(ファイルの所有者)」,次は「自分と同じグループのユーザ」,最後が「自分と違うグループのユーザ」の情報です.

chmodコマンドでパーミッションを指定するとき,3桁の数字ではなく,「誰に」「どんな権限を」「与えるか与えないか」の形で指定する方法もあります.(参考)

lsコマンドでディレクトリの情報を見たいときは,以下の二つを使い分けてください.

2.5.4 ファイルのパーミッション*

以下の数字が,ファイルのパーミッションとしてよく用いられます.

パーミッション(数字)パーミッション(ls出力)意味用途
644rw-r--r--自分は読み書き,他人は読みだけ通常のファイル.Webサーバが参照することになるディレクトリのパーミッションは,これにする.
755rwxr-xr-x自分は全て可,他人は読み実行通常の実行可能なファイル.CGIファイルのパーミッションは,これにする.
600rw-------自分は読み書き,他人は全て不可秘密のファイル
700rwx------自分は全て可,他人は全て不可秘密の実行可能なファイル

2.5.5 ディレクトリのパーミッション*

ディレクトリの「読める」,「書ける」,「実行できる」は,ファイルのそれらと少し違っています.

以下の数字が,ディレクトリのパーミッションとしてよく用いられます.

パーミッション(数字)パーミッション(ls出力)意味用途
755rwxr-xr-x自分は全て可,他人は読み実行通常のディレクトリ.Webサーバが参照することになるディレクトリのパーミッションは,これにする.
700rwx------自分は全て可,他人は全て不可秘密のディレクトリ

トップへ / 次へ