OpenWindows ユーザーズガイド (上級編)

第 3 章 ファイルとディレクトリの操作

ファイルとディレクトリに関する操作は、SunOS のコマンド行から実行できます。特定の操作を実行するには、SunOS コマンドとファイルやディレクトリの名前を一緒に指定します。この方法は OpenWindows のファイルマネージャを使う場合とは異なります。ファイルマネージャでは、ファイルはマウスのクリックや移動で操作できるアイコンとして表示され、コマンドはメニューから選択できます。

この章では、SunOS のコマンド行からファイルとディレクトリを操作するために必要な手順と概念について説明します。OpenWindows 環境でシェルツールまたはコマンドツールを使う場合やリモート端末からログインする場合でも、SunOS のコマンド行に対してこれらの操作を適用できます。SunOS オペレーティングシステムを活用するためにも、この章で説明する概念を理解しておいてください。

ファイルの概念

ファイルは、SunOS オペレーティングシステムの基本的な単位です。次のものがファイルとして取り扱われます。

以下の節では、ファイルの作成、一覧表示、コピー、移動、削除に利用できるコマンドを説明します。また、ファイルの内容を表示する方法やファイルの特性を決定する方法についても説明します。

ファイル操作コマンドの使い方

この節で示す各コマンドについては、その使用例が提供されています。本文を読みながら、これらの例を試してください。実際に実行することによって、コマンドとその個々の概念をよく理解でき、簡単に覚えることができます。

ファイル操作を始める前に

ファイル操作を行う前に、ホームディレクトリにいることを確認してください。ホームディレクトリとは、アカウントの作成時にシステム管理者によって各ユーザに割り当てられたディレクトリです。以下の例で示す操作を自分のホームディレクトリで実行していれば、システムのうち他のユーザに影響を及ぼすような領域内でファイルを作成、コピー、移動、(最悪の場合は) 削除する危険性は少なくなります。

cd (change directory) コマンドを引数なしで入力することによって、各ユーザは自分のホームディレクトリに移動できます。次に pwd (print working directory) コマンドを入力して、ファイルシステム内での現在位置を表示します。このとき表示されるディレクトリが各ユーザのホームディレクトリです。

$ cd
$ pwd
/export/home/username

上記の例では、ユーザのホームディレクトリは /export/home/username です。username は、このホームディレクトリを所有しているユーザの名前です。

テスト用ファイルの作成

空のファイルを作成するには、touch コマンドを使います。指定した名前のファイルが存在しない場合は、touch コマンドが空のファイルを作成します。ファイルが存在する場合は、ファイルの最新アクセス時間が更新されます。

$ touch tempfile
$ 

ファイルの一覧表示 (ls)

ファイルが作成されたことを確認するために、ls コマンドを使ってファイル名を表示します。

$ ls tempfile
tempfile 

ls コマンドを引数なしで入力すると、カレントディレクトリ内のファイルの一覧が表示されます。特定のファイル名を指定して ls コマンドを入力すると、そのファイルが存在する場合は指定されたファイルだけが表示されます。

ls コマンドについての詳細は、『SunOS リファレンスマニュアル (1): ユーザーコマンド』を参照してください。

ファイルのコピー (cp)

tempfilecopyfile というファイルにコピーするには、cp コマンドを使います。

$ cp tempfile copyfile
$ 

ここで両方のファイルの一覧を表示してみましょう。どちらのファイル名も「file」という文字列で終わることに注目してください。任意の 1 文字または文字列を表すには、ワイルドカード文字のアスタリスク (*) が使えます。したがって、ls *file というコマンドを入力すると、tempfilecopyfile の両方が表示されます。この場合、カレントディレクトリ内に他に file で終わる名前のファイルがあれば、そのファイルも表示されます。

$ ls *file
copyfile    tempfile

copyfile が最初に表示されることに注意してください。ファイルはアルファベット順に表示されます。ただし、大文字と数字は小文字より先に表示されます。

cp コマンドについての詳細は、『SunOS リファレンスマニュアル (1): ユーザーコマンド』を参照してください。

ファイルの移動とファイル名の変更 (mv)

mv (move) コマンドを使って、ファイルの移動とファイル名の変更が行えます。次の例では、mv コマンドを使ってファイル名を tempfile から emptyfile に変更しています。

$ mv tempfile emptyfile
$ 

上記の変更を確認するために、両方のファイルのリストを再表示します。

$ ls *file
copyfile    emptyfile

このリストから分かるように、tempfileemptyfile で置き換えられています。

mv コマンドについての詳細は、『SunOS リファレンスマニュアル (1): ユーザーコマンド』を参照してください。

ファイルの削除 (rm)

最後に、rm (remove) コマンドを使って copyfile を削除し、ls コマンドでその結果を確認します。

$ rm copyfile
$ ls *file
emptyfile


注意 - 注意 -

rm コマンドは注意して使ってください。ファイルは一度削除すると永久に消えてしまい、バックアップコピーがない限り復元できません。特にワイルドカード文字 (*) と rm を共に使う場合は細心の注意を払ってください。


rm コマンドについての詳細は、『SunOS リファレンスマニュアル (1): ユーザーコマンド』を参照してください。

ファイル内容の表示 (morecat)

ファイルの内容を表示するには、more コマンドを使います。more の後に、表示するファイル名を指定します。ファイルの内容は、画面に表示されます。ファイルが 1 画面より長い場合は、次のメッセージが表示されます。

--More--(nn%)  [Press space to continue, `q' to quit.]

nn はすでに表示されたファイルの割合です。

ファイル内容の表示には cat (concatenate) コマンドも使えますが、この場合はファイル全体が休止することなく一度に表示されます。cat コマンドは、ファイルの表示よりも 2 つ以上のファイルを 1 つの大きいファイルに連結する場合によく使われます。ファイルの連結例を以下に示します。

$ cat file1 file2 file3 > bigfile
$ ls *file
bigfile
file1
file2
file3
$

more コマンドと cat コマンドについての詳細は、『SunOS リファレンスマニュアル (1): ユーザーコマンド』を参照してください。

ファイル形式の表示 (file)

ファイルによっては、バイナリファイルや実行可能ファイルのように、プリンタに印刷したり画面上に表示したりできないものがあります。ファイル形式が不明な場合は、file コマンドを使うと便利です。

file コマンドは、ファイル形式の表示に使います。

$ file copyfile
copyfile:    ascii text

ディレクトリとディレクトリ階層

前節までに、ファイルの作成、一覧表示、コピー、削除、ファイル名の変更などの方法を説明しました。しかし、これらのファイルがどこに存在するのかという大きな問題が残っています。この節では、ディレクトリ階層について説明します。以下の解説をよく読んで、各節で示す例を実行してみてください。

ディレクトリ階層

ファイルはディレクトリにまとめられますが、ディレクトリ自体も階層構造になっています。この階層の最上位は「ルート」ディレクトリと呼ばれ、「/」で表されます。

次の図 3-1 の例で示すように、ファイルシステム内の各ディレクトリは、その中に多数のサブディレクトリを持つことができます。表記上は、ディレクトリのレベルを「/」文字で識別します。この点を考慮して、/ (ルート) ディレクトリには、/usr/bin/home/lib というサブディレクトリがあることに注意してください。さらに /home サブディレクトリには、user1user2user3 というサブディレクトリがあります。

ディレクトリ (およびその中のファイル) を指定する場合、それが存在するディレクトリの名前も含めます。これをパス名と呼びます。たとえば、図 3-1user3 ディレクトリのパス名は、/home/user3 です。

図 3-1 ファイルシステム階層

Graphic

同一ディレクトリ内のすべてのサブディレクトリとファイルの名前は一意でなければなりませんが、ディレクトリが異なればこれらの名前が同じであってもかまいません。たとえば、/usr ディレクトリには /usr/lib というサブディレクトリがあります。/usr/lib/lib とではパス名が異なるため、これらの名前は互いに矛盾しません。

ファイルのパス名の機能は、ディレクトリのパス名とまったく同じです。ファイルのパス名は、ファイルシステム階層におけるそのファイルの位置を表します。たとえば、/home/user2 ディレクトリに report5 というファイルがあるとすると、そのファイルのパス名は /home/user2/report5 となります。このパス名は、ファイル report5 はディレクトリ user2 の中にあり、user2 はディレクトリ home の中にあり、home はルート (/) ディレクトリの中にあることを示しています。

ディレクトリの中には、サブディレクトリだけ、ファイルだけ、またはその両方を格納できます。

作業用ディレクトリの表示 (pwd)

pwd (print working directory) コマンドは、ファイルシステム階層内でのユーザの現在位置を表示します。

$ pwd
/home/user1

実際のディレクトリ構造が異なる場合は、pwd の出力結果が上記の例とは異なるものになります。作業用ディレクトリがファイルシステム階層内でのユーザの現在位置になることに注意してください。

ユーザのホームディレクトリ

各ユーザはホームディレクトリを持っています。OpenWindows 環境でシェルツールやコマンドツールのウィンドウを開いたときは、最初の位置 (作業用ディレクトリ) がホームディレクトリになります。ホームディレクトリは、アカウントの作成時にシステム管理者によって各ユーザに割り当てられます。

作業用ディレクトリの変更 (cd)

cd (change directory) コマンドを使うと、ファイルシステム階層内を自由に移動できます。

$ cd /usr/lib
$ pwd
/usr/lib

cd コマンドを引数なしで入力すると、自分のホームディレクトリに戻ります。たとえば、ホームディレクトリが /home/user1 の場合は、次のようになります。

$ cd
$ pwd
/home/user1

C シェルでは、ホームディレクトリを表す短縮名としてチルド文字 () が使われます。たとえば、次のように入力するとホームディレクトリ内の music サブディレクトリに移動できます。

example% cd ‾/music

この短縮名を使って他のユーザのホームディレクトリを指定することもできます。次の例を参照してください。

example% cd ‾username

username は他のユーザのログイン名です。このコマンドによって、そのユーザのホームディレクトリに移動します。


注 -

Bourne シェルを使っている場合は、この短縮名 ‾ は機能しません。


Bourne シェルを使っているときは、$home と入力するとホームディレクトリに移動できるようにシステム管理者がシステムを構成している場合があります。その場合は、次のように入力すると、ホームディレクトリ内の music サブディレクトリに移動できます。

$ $home/music

同様に、次のように入力すると、指定したユーザのホームディレクトリに移動できます。

$ $homeusername

username は他のユーザのログイン名です。

サブディレクトリのすぐ「上」のディレクトリは、親ディレクトリと呼ばれます。前記の例では、/home/home/user1 の親ディレクトリです。親ディレクトリは、シンボル .. (ピリオドを 2 つ) で表します。したがって、cd .. というコマンドを入力すると、次の例で示すように、作業用ディレクトリが親ディレクトリに変わります。

$ pwd
/home/user1
$ cd ..
$ pwd
/home

現在の作業用ディレクトリが /home/user1 のときに /home/user2 にあるファイルを操作したい場合は、次のような短縮名を利用すると便利です。

$ pwd
/home/user1
$ cd ../user2
$ pwd
/home/user2

../user2 は、user2 の親ディレクトリを経由するようシステムに指示します。この例に示すように、フルパス名 /home/user2 を入力するより簡単です。

ディレクトリの作成 (mkdir)

mkdir コマンドの後に新しいディレクトリの名前を指定するだけで、新規ディレクトリを簡単に作成できます。

$ mkdir veggies
$ cd veggies
$ mkdir broccoli
$ cd broccoli
$ pwd
/home/user2/veggies/broccoli

相対パス名

ファイルやディレクトリのフルパス名はスラッシュ (/) で始まり、そのファイルまたはディレクトリとルートディレクトリとの間のディレクトリ構造全体を表します。ただし、現在の作業用ディレクトリに対するファイルやディレクトリの相対関係を表す省略名 (相対パス名) を使うこともできます。

親ディレクトリにいる場合は、フルパス名ではなくディレクトリ名だけを指定すればサブディレクトリに移動できます。前記の例では、cd veggies というコマンドで veggies ディレクトリの相対パス名が使われています。現在の作業用ディレクトリが /home/user2 の場合、このディレクトリのフルパス名は /home/user2/veggies となります。

別個のサブディレクトリをいくつか作成し、そのディレクトリ構造の中を移動してみてください。移動の際にはフルパス名と相対パス名の両方を使ってみてください。現在位置は pwd コマンドで確認します。

ディレクトリの移動とディレクトリ名の変更

ディレクトリを別の名前に置き換えることによって、ディレクトリ名を変更できます。ディレクトリ名の変更には mv コマンドを使います。

$ pwd
/home/user2/veggies
$ ls
broccoli
$ mv broccoli carrots
$ ls
carrots

mv コマンドを使って、ディレクトリをすでにある別のディレクトリ内に移動することもできます。

$ pwd
/home/user2/veggies
$ ls
carrots
$ mv carrots ../veggies2
$ ls ../veggies2
carrots

この例では、mv コマンドを使って、carrots ディレクトリを veggies から veggies2 に移動しています。

ディレクトリのコピー

ディレクトリとその下にあるファイルをコピーする場合は、cp -r コマンドを使います。

$ cp -r veggies veggies3
$

このコマンドは、veggies ディレクトリに含まれるすべてのファイルとサブディレクトリを、新しいディレクトリ veggies3 にコピーします。これは「再帰的コピー」と呼ばれ、-r (recursive) オプションで指定します。このオプションを指定しないでディレクトリをコピーしようとすると、エラーメッセージが出されます。

ディレクトリの削除 (rmdir)

空のディレクトリを削除する場合は、rmdir コマンドを使います。

$ rmdir veggies3
$ 

ディレクトリにファイルやサブディレクトリが含まれている場合、rmdir コマンドではディレクトリは削除できません。

ディレクトリとその内容 (すべてのサブディレクトリやその中のファイルも含む) を削除する場合は、次に示すように rm -r (再帰的削除を指示する -r オプションを rm コマンドに付加したもの) を使います。

$ rm -r veggies3
$


注意 - 注意 -

rmdir コマンドで削除したディレクトリは復元できません。rm -r コマンドで削除したディレクトリとその内容についても同様に復元できません。


ファイル間の相違点を検出する (diff)

各ユーザが別々に同一のファイルをコピーし、そのコピーを編集するという場合があります。その場合 diff コマンドを使うと、バージョンの異なるファイルについて相違点を検出することができます。次のコマンドは、leftfilerightfile の各行を走査して相違点を表示します。

$ diff leftfile rightfile

異なる行が見つかると、diff はその相違の原因 (行の追加、削除、変更) と影響を受けた行数を判断し、各ファイル内の個々の相違箇所の行番号と該当テキストを表示します。

相違の原因が行の追加による場合、diff は次の形式で行番号を表示します。

   
l[,l] a r[,r]

lleftfile の行番号、rrightfile の行番号です。

相違の原因が行の削除による場合は、上記の a の代わりに d が表示され、行の変更による場合は c が表示されます。

各ファイル内の該当行は、行番号情報の次の行に表示されます。leftfile 内のテキストの前には左角括弧 (<) が付き、rightfile 内のテキストの前には右角括弧 (>) が付きます。

次の例では、最初に 2 つのファイルの内容を表示し、その後で diff コマンドを使ってそれらの相違点を表示しています。

$ cat sched.7.15
Week of 7/15

Day:  Time:        Action Item:          Details:

T     10:00        Hardware mtg.         every other week
W     1:30         Software mtg.
T     3:00         Docs. mtg.
F     1:00         Interview
$ cat sched.7.22
Week of 7/22

Day:  Time:        Action Item:          Details:

M     8:30         Staff mtg.            all day
T     10:00        Hardware mtg.         every other week
W     1:30         Software mtg.
T     3:00         Docs. mtg.
$ diff sched.7.15 sched.7.22
1c1
< Week of 7/15
---
> Week of 7/22
4a5
> M     8:30         Staff mtg.            all day
8d8
< F     1:00         Interview

比較される 2 つのファイルの内容が同じであれば、diff コマンドを実行しても、何も出力されません。

diff コマンドには、この節で説明した以外にも多数のオプションがあります。詳細については、『SunOS リファレンスマニュアル (1): ユーザーコマンド』を参照してください。

3 つのファイルを比較する (diff3)

あるファイルの 3 つのバージョンを同時に比較する場合は、次に示す diff3 コマンドを使います。

$ diff3 file1 file2 file3

diff3 コマンドはファイルの 3 つのバージョンを比較し、内容が異なる範囲に以下のコードを付加して表示します。

====      3 つのファイルがすべて異なる
====1     file1 が他の 2 つと異なる
====2     file2 が他の 2 つと異なる
====3     file3 が他の 2 つと異なる

大きいファイルを bdiff を使って比較する

非常に大きいファイルを比較する場合は、diff の代わりに bdiff コマンドを使います。bdiff の使い方と出力内容は、diff と同じです。

$ bdiff leftfile rightfile

3500 行以上のファイルでは、diff ではなく bdiff を使ってください。

ファイル名の検索 (find)

find コマンドを使うと、指定した条件に合致するファイル名の検索を、特定のディレクトリから開始できます。たとえば、特定のパターンに一致するファイル名や一定の期間内に変更されたファイル名などを検索できます。

他の大部分のコマンドとは違って、find のオプションはいくつかの文字からなり、コマンド行ではオプションより前に、検索を開始するディレクトリ名を指定する必要があります。

$ find directory options

directory は検索を開始するディレクトリ名、optionsfind コマンドのオプションです。

各オプションは、ファイルの選択基準を指定します。選択されるファイルは、すべての基準を満たしている必要があります。したがって、指定するオプションの数が多くなるほど、選択されるファイルの範囲は狭くなります。-print オプションを指定すると、検索結果が表示されます。

find コマンドで -name filename オプションを指定すると、filename に一致するファイルだけが選択されます。この filename は、フルパス名のファイルの一番右側の要素と見なされます。たとえば、/usr/lib/calendar の一番右側の要素は calendar です。通常、フルパス名中のこの要素は、ファイルのベース名と呼ばれます。

たとえば、カレントディレクトリとそのサブディレクトリ内で s で終わるファイルを検索する場合は、次のように入力します。

$ find . -name '*s' -print
./programs
./programs/graphics
./programs/graphics/gks
./src/gks
$

find コマンドでは次のオプションを使えます。

¥(options¥) のように、エスケープされた括弧でオプションを囲むことによって、検索条件の優先度を指定できます。エスケープされた括弧内では、各オプションの間に -o フラグを挿入して、両方のカテゴリではなく、どちらか一方のカテゴリに分類されたファイルを選択するよう find に指定できます。

$ find . ¥( -name AAA -o -name BBB ¥) -print
./AAA
./BBB

オプションの前にエスケープされた感嘆符を付けることによって、オプションの意味を逆にできます。この場合、find はオプションで指定された条件に合致しないファイルを選択します。

$ find . ¥!-name BBB -print
./AAA

また次のオプションを使うと、find で検索されたファイルに対して特定のコマンドを実行できます。

-exec command '{}' ¥;

このオプションは、エスケープされたセミコロン (¥;) で終了します。引用符付きの大括弧 ('{}') は、find によって選択されたファイル名で置き換えられます。

たとえば、find コマンドを利用すれば一時的な作業用ファイルを自動的に削除できます。一定の規則に従って一時ファイル名を指定しておくことにより、その存在場所にかかわらず、find を使ってそれらの一時ファイルを検索した上で破棄できます。たとえば、一時ファイル名を junk または dummy と指定した場合は、次のコマンドによってそれらの検索と削除を実行できます。

$ find . ¥( -name junk -o -name dummy ¥) -exec rm '{}' ¥;

find コマンドについての詳細は、『SunOS リファレンスマニュアル (1): ユーザーコマンド』を参照してください。

ファイルとディレクトリのセキュリティ


注 -

この節は注意してよく読んでください。日常のファイル操作では、ファイルのアクセス権を正確に理解しておく必要があります。


ファイルのアクセス権は、ファイルとディレクトリを許可なく読み書きされないように保護します。他のユーザに対してファイルの読み取りは許可しても変更は許可したくない場合があります。また、実行可能ファイル (プログラム) を共有したい場合もあります。このような場合、ファイルのアクセス権を利用して、ファイルに対するアクセスを管理できます。

ファイルとディレクトリに関する基本的なアクセス権の種類は次のとおりです。

アクセス権の設定対象となるユーザは、次の 3 つに分類できます。

アクセス権と状態の表示 (su ls -l)

ls コマンドを使ってファイルを一覧表示してみます。ls コマンドには多数のオプションがあります。詳細形式の一覧を表示するには、-l オプションを使います。ファイルとディレクトリはアルファベット順に表示されます。このオプションを使って表示したファイル一覧の例を図 3-2 に示します。

図 3-2 アクセス権とステータスの表示

Graphic

各行の最初の文字は、ファイル形式を示します。ダッシュ (-) は通常ファイル、d はディレクトリ、その他の文字は特殊なファイル形式を表します。

次の 9 文字は、ファイルやディレクトリのアクセス権を示します。これら 9 文字は、3 文字ずつの 3 つのグループから構成され、それぞれ所有者、所有者のグループ、その他の全ユーザのアクセス権を表します。たとえば、emptyfile のアクセス権は、rw-r--r-- となっています。このファイルの場合、所有者は読み取りと書き込みが行え、すべてのユーザは読み取りだけは行えますが、どのユーザも実行はできません。また、ディレクトリ veggies2 のアクセス権は、rwxr-xr-x となっています。このディレクトリの場合、どのユーザでも読み取りと実行が行えますが、書き込みが行えるのは所有者に限られます。

ファイルのアクセス権の他に、上記のリストには次の情報が含まれています。

cd コマンドを使って自分のホームディレクトリに移動し、ls -l コマンドを入力してみてください。表示される結果は上記の例とは当然異なります。

次に、以下のようなコマンドを入力してみます。

$ ls -l dirname

dirname は、ユーザのファイルシステム内の実際のディレクトリ名です。ディレクトリ名を指定すると、ls -l コマンドは、そのディレクトリ内にあるディレクトリ (ただし、存在する場合だけ) とファイルに関する情報を出力します。

隠しファイルの表示 (ls -a)

通常の ls コマンドでは表示されないファイルもあります。これらのファイルは、.cshrc.login.profile のように . (ドット) で始まる名前を持っています。このようなドットファイルを表示するには、ls -a コマンドを使います。

$ ls -a
.
..
.cshrc
.login
.profile
emptyfile

. で始まるファイルは、他のファイルよりも前に表示されることに注意してください。このリストには、2 つの特殊ファイルが表示されています。ファイル . はカレントディレクトリを示し、ファイル .. は親ディレクトリを示します。

一般に、. で始まるファイルはシステムユーティリティによって使われ、通常はユーザが変更するものではありません。ただし、少数ですが例外もあります。

アクセス権の変更 (chmod)

ファイルやディレクトリのアクセス権を変更する場合は、chmod コマンドを使います。アクセス権を変更するには、そのファイルやディレクトリの所有者であるか、root にアクセスできる必要があります。chmod コマンドの一般的な形式は次のとおりです。

chmod permissions name

permissions は変更用のアクセス権、name は影響を受けるファイルやディレクトリの名前を示します。

アクセス権を指定するには、いくつかの方法があります。ここでは最も簡単な方法を紹介します。

  1. 次の文字のどれかを使って関連するユーザを指定します。

    • u (所有者)

    • g (グループ)

    • o (他のユーザ)

    • a (上記 3 つのカテゴリの全ユーザ)

  2. アクセス権を付加するか (+) 除去するか (-) を指定します。

  3. 次のいずれかの文字を使って関連するアクセス権を指定します。

    • r (読み取り)

    • w (書き込み)

    • x (実行)

次の例では、carrots ディレクトリに対する書き込み権を、同じグループに属するユーザに付与しています (つまり permissionsg+wnamecarrots)。

$ ls -l carrots
drwxr-xr-x  3 user2           1024 Feb 10 11:15 carrots
$ chmod g+w carrots
$ ls -l carrots
drwxrwxr-x  3 user2           1024 Feb 10 11:15 carrots
$

例で示すように、グループのアクセス権のハイフン (-) が chmod コマンドの実行後は w に変更されています。

この同じディレクトリに対する読み取り権と実行権を、グループに属さない他のユーザから除去するには (permissionso-rx)、次のように入力します。

$ ls -l carrots
drwxrwxr-x  3 user2           1024 Feb 10 11:15 carrots
$ chmod o-rx carrots
$ ls -l carrots
drwxrwx---  3 user2           1024 Feb 10 11:15 carrots
$

他のユーザのアクセス権の r (読み取り権) と x (実行権) が、両方ともハイフン (-) に変更されたことが分かります。

新しいファイルやディレクトリを作成すると、アクセス権がシステムによって自動的に割り当てられます。

通常、新規ファイルに関するデフォルト設定は次のようになります。

-rw-r--r--

また、新規ディレクトリについては次のようになります。

drwxr-xr-x

したがって、turnip という新規ファイルをその所有者 (user2) が実行できるようにする場合は、次のように入力します。

$ ls -l turnip
-rw-r--r--  3 user2           1024 Feb 10 12:27 turnip
$ chmod u+x turnip
$ ls -l turnip
-rwxr--r--  3 user2           1024 Feb 10 12:27 turnip
$

3 つのカテゴリの全ユーザのアクセス権を変更する場合は、-a オプションを使います。たとえば、garlic という新規ファイルを全ユーザが実行できるようにするには、次のように入力します。

$ ls -l garlic
-rw-r--r--  3 user2           1024 Feb 10 11:31 garlic
$ chmod a+x garlic
$ ls -l garlic
-rwxr-xr-x  3 user2           1024 Feb 10 11:31 garlic
$

上記の chmod コマンドの結果、3 つのカテゴリの全ユーザに x (実行権) が与えられます。

ワイルドカード文字の * を使って、複数のファイルやディレクトリのアクセス権を変更することもできます。たとえば、カレントディレクトリ veggies 内の全ファイルのアクセス権を変更して、所有者だけがファイルの書き込みをできるようにする場合は、次のように入力します。

$ pwd
/home/user2/veggies
$ ls -l
-rwxrwxrwx  3 user2          21032 Feb 12 10:31 beats
-rwxrwxrwx  2 user2             68 Feb 10 11:09 corn
-rwxrwxrwx  3 user2          12675 Feb 08 09:31 garlic
-rwxrwxrwx  1 user2           1024 Feb 14 16:38 onions
$ chmod go-w *
$ ls -l
-rwxr-xr-x  3 user2          21032 Feb 12 10:31 beats
-rwxr-xr-x  2 user2             68 Feb 10 11:09 corn
-rwxr-xr-x  3 user2          12675 Feb 08 09:31 garlic
-rwxr-xr-x  1 user2           1024 Feb 14 16:38 onions
$

上記の例では、この chmod 操作をこれからどのディレクトリで実行するのか確認する必要があることを示すために、pwd コマンドを最初に実行しています。

絶対アクセス権の設定

アクセス権に関する前節までの説明では、chmod コマンドを使って現在のアクセス権の設定を相対的に変更する方法だけを取り扱ってきました。chmod コマンドの別の方法を使うことによって、ファイルやディレクトリの絶対的なアクセス権を設定できます。この方法では、アクセス権を指定する数値コードを使います。

この形式の chmod コマンドの構文は次のとおりです。

chmod numcode name

numcode は数値コード、name はアクセス権が変更されるファイルやディレクトリの名前です。

数値コードは、3 つの数字からなります。1 つの数字が 3 つのユーザカテゴリ (所有者、グループ、他のユーザ) の各々に適用されます。たとえば、次のコマンドは、所有者とグループに対して読み取り権、書き込み権、実行権の絶対アクセス権を設定し、他のユーザに対して実行権だけを設定しています。

$ chmod 771 garlic

表 3-1 は、garlic のアクセス権が 771 というコードによって、どのように表現されるかを示しています。

表 3-1 garlic のアクセス権

アクセス権 

所有者 

グループ 

他のユーザ 

読み取り権 

書き込み権 

実行権 

合計 

表 3-1 の各列は、所有者、グループ、他のユーザというユーザカテゴリにそれぞれ対応しています。読み取り権を設定するには、適切な列に 4 を挿入します。同様に、書き込み権を設定するには 2 を挿入し、実行権を設定するには 1 を挿入します。表の最終行に表示された各列のそれぞれの合計値が最終的な数値コードになります。

この方法によって絶対アクセス権を設定するもう 1 つの例を次に示します。ここでは chmod の結果を確認するために、ls -l コマンドを実行しています。

$ ls -l onion
-rw-r--r--  3 user2           1024 Feb 10 11:46 onion
$ chmod 755 onion
$ ls -l onion
-rwxr-xr-x  3 user2           1024 Feb 10 11:48 onion
$

ファイル onion のアクセス権は、所有者に対しては読み取り、書き込み、実行が可能、グループと他のユーザに対しては読み取りと実行が可能になるよう設定されています。onion のアクセス権の設定に使われた数値コードを表 3-2 にまとめます。

表 3-2 onion のアクセス権

アクセス権 

所有者 

グループ 

他のユーザ 

読み取り権 

書き込み権 

実行権 

合計 

また、ファイル cabbage に関する読み取り、書き込み、実行の全アクセス権を所有者、グループ、他のユーザに与える場合は、次のように入力できます。

$ ls -l cabbage
-rw-r--r--  3 user2           1024 Feb 10 11:51 cabbage
$ chmod 777 cabbage
$ ls -l cabbage
-rwxrwxrwx  3 user2           1024 Feb 10 11:53 cabbage
$

この例の数値コードを表 3-3 にまとめます。

表 3-3 cabbage のアクセス権

アクセス権 

所有者 

グループ 

他のユーザ 

読み取り権 

書き込み権 

実行権 

合計 

777 という数値コードが、指定できる最大のアクセス権の値です。

相対アクセス権の変更の場合と同様に、ワイルドカード文字の * を使ってカレントディレクトリ内の全ファイルの絶対アクセス権を設定することもできます。たとえば、カレントディレクトリ veggies 内の全ファイルに絶対アクセス権を設定することで、所有者は読み取り権と書き込み権と実行権、グループは読み取り権と実行権、他のユーザは実行権だけを持つようにするには、次のように入力します。

$ pwd
/home/user2/veggies
$ ls -l
-rwxrwxrwx  3 user2          21032 Feb 12 10:31 beats
-rwxrwxrwx  2 user2             68 Feb 10 11:09 corn
-rwxrwxrwx  3 user2          12675 Feb 08 09:31 garlic
-rwxrwxrwx  1 user2           1024 Feb 14 16:38 onions
$ chmod 751 *
$ ls -l
-rwxr-x--x  3 user2          21032 Feb 12 10:31 beats
-rwxr-x--x  2 user2             68 Feb 10 11:09 corn
-rwxr-x--x  3 user2          12675 Feb 08 09:31 garlic
-rwxr-x--x  1 user2           1024 Feb 14 16:38 onions
$

上記の例では、この chmod 操作をこれからどのディレクトリで実行するのか確認する必要があることを示すために、pwd コマンドを最初に実行しています。最初の ls -l コマンドは、アクセス権の変更結果を明らかにするために実行しています。相対アクセス権とは違って、絶対アクセス権を設定するときは、アクセス権の現在の設定状態を知る必要はありません。

chmod コマンドについての詳細は、『SunOS リファレンスマニュアル (1): ユーザーコマンド』を参照してください。