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

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

ファイルとディレクトリの作業、編成、管理は、SunOS コマンドを使って行えます。特定の操作を行うには、ファイルやディレクトリを指定して SunOS コマンドを実行します。コマンド行の操作は、デスクトップのファイルマネージャとは異なります。ファイルマネージャでは、ファイルはマウスクリックや移動が可能なアイコンとして表示され、コマンドはメニューから選択できます。

この章の内容は次のとおりです。

ファイルの概念

ファイルは、SunOS オペレーティングシステムの基本的な単位です。次に示す要素を始めとして、ほとんどあらゆるものがファイルとして扱われます。

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

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

この節の各コマンド説明には、その使用例が示されています。本文を読みながら、これらの例を試してください。

始める前に

ファイル操作を行う前に、ホームディレクトリにいることを確認してください。ホームディレクトリは、ユーザアカウントの作成時にシステム管理者によって作成されます。ほかのユーザに影響を与える変更を避けるには、自分のホームディレクトリ内で以下の作業を実行してください。

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


$ cd

$ pwd

/export/home/username

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

テスト用ファイルの作成

空のファイルを作成するには、touch コマンドを使います。


$ touch tempfile

$ 

名前を指定したファイルが存在しない場合、touch コマンドが空のファイルを作成します。


注 –

ファイルが存在する場合は、最終アクセス時間が更新されます。


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

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


$ ls tempfile

tempfile 

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

ファイル表示の詳細は、ls(1) のマニュアルページを参照してください。

ファイルのコピー (cp)

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


$ cp tempfile copyfile

$ 

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


$ ls *file

copyfile    tempfile

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

ファイルのコピーについての詳細は、cp(1) のマニュアルページを参照してください。

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

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


$ mv tempfile emptyfile

$ 

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


$ ls *file

copyfile    emptyfile

tempfileemptyfile で置き換えられます。

ファイルの移動と名前変更の詳細は、mv(1) のマニュアルページを参照してください。

ファイルの削除 (rm)

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


$ rm copyfile

$ ls *file

emptyfile

注意 – 注意 –

rm コマンドの使用には注意を払ってください。特に、ワイルドカード文字 (*) を指定してこのコマンドを使用する場合は細心の注意を払う必要があります。rm を使用して削除したファイルの復元は行えません。


rm(1) コマンドについての詳細は、『man pages section 1: User Commands』を参照してください。

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

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


--More--(nn%)

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

ファイル内容の表示には cat (concatenate) コマンドも使えますが、このコマンドでは連続してすばやくファイル内容が表示されます。cat コマンドは、ファイルの表示よりも 2 つ以上のファイルを 1 つの大きいファイルに連結する場合によく使われます。ファイルの連結例を以下に示します。


$ cat file1 file2 file3> bigfile

$ ls *file

bigfile

file1

file2

file3

$

more(1) コマンドと cat(1) コマンドに ついての詳細は、『man pages section 1:User Commands』を参照してください。

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

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


$ file *

myscript:      executable shell script

print.ps:      PostScript document

save.txt:      ascii text

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

この節では、ファイルの管理や整理のために Solaris オペレーティング環境で使用するディレクトリ階層について説明します。

ディレクトリ階層

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

次の図 3–1 の例では、ファイルシステム内のディレクトリごとに多数のサブディレクトリがあります。文字「/」は、ディレクトリのレベルを識別するために使用されます。/ (ルート) ディレクトリには、/usr/bin/export/home/lib というサブディレクトリなどがあります。さらに /export/home サブディレクトリには、user1user2user3 などのサブディレクトリがあります。

コマンドを実行するには、その対象となるファイルまたはディレクトリを含むディレクトリを指定する必要があります。指定されるディレクトリの下に存在するディレクトリとファイルの名前は、区切り文字であるスラッシュで結合されてパス名を形成します。たとえば、次の図の user3 ディレクトリのパス名は /export/home/user3 です。

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

前後のコンテキストで、この図について説明しています。

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

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

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

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


$ pwd

/home/user1

実際の出力は、ディレクトリ構造の違いのためにこの例とは異なることがあります。作業用ディレクトリが、ファイルシステム階層内でのユーザの現在位置となります。

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

各ユーザはホームディレクトリを持っています。端末またはウィンドウを始めて開いたときには、最初の位置がホームディレクトリになります。ホームディレクトリは、ユーザアカウントの作成時にシステム管理者によって作成されます。

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

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


$ cd /usr/lib

$ pwd

/usr/lib

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


$ cd

$ pwd

/home/user1

ホームディレクトリは /export/home/user1 ですが、cd コマンドはユーザを /home/user1 に返します。これは、ホームディレクトリがオートマウンタによって /home ディレクトリにマウントされているためです。

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


example% cd ~/music

この短縮名を使ってほかのユーザのホームディレクトリを指定することもできます。次に例を示します。


example% cd ~username

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


注 –

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


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


$ cd $home/music

サブディレクトリのすぐ「上」のディレクトリは、親ディレクトリと呼ばれます。前記の例では、/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 コマンドではディレクトリは削除できません。

ディレクトリとそのすべての内容 (すべてのサブディレクトリおよびファイル) を削除する場合は、再帰的削除を指示する -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 内のテキストの前には右角括弧 (>) が付きます。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 コマンドを実行しても何も出力されません。

diff1 コマンドについての詳細は、『man pages section 1: User Commands』を参照してください。

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 オプションを指定すると、検索結果が表示されます。

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

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


$ find . -name '*s' -print

./programs

./programs/graphics

./programs/graphics/gks

./src/gks

$

次の表は、find コマンドのその他のオプションを示しています。

表 3–1 find オプション

オプション 

説明 

-name filename

絶対パス名の一番右側の要素 (ベース名) が filename に一致するファイルを選択します。filename にファイル名の置換パターン (正規表現) が含まれる場合は、filename を単一引用符 (`) で囲みます。

-user userid

userid が所有しているファイルを選択します。userid はログイン名、ユーザ ID 番号のどちらでもかまいません。

-group group

group に属するファイルを選択します。

-mtime n

n 日前に変更されたファイルを選択します。

-newer checkfile

checkfile よりあとに変更されたファイルを選択します。

 

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


$ find . \( -name AAA -o -name BBB \) -print

./AAA

./BBB

上記の例では、find コマンドは . ディレクトリ内で 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(1) のマニュアルページを参照してください。

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

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

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

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

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

ファイルとディレクトリの詳細一覧をアルファベット順に出力するには、-l を指定して ls コマンドを実行します。

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

次のコンテキストは、画面の出力について説明しています。

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

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

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

ディレクトリ名を指定すると、ls -l コマンドは、そのディレクトリ内にあるディレクトリとファイルに関する情報を出力します。

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

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


$ ls -a

.

..

.cshrc

.login

.profile

emptyfile

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

一般に、. で始まるファイルはシステムユーティリティによって使われ、通常はユーザが変更するものではありません。この規則には例外もいくつかあります。

アクセス権の変更 (chmod)

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


chmod permissions name

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

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

  1. 次の文字のどれかを使ってユーザのタイプを指定します。

    • u (所有者)

    • g (グループ)

    • o (ほかのユーザ)

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

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

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

    • r (読み取り)

    • w (書き込み)

    • x (実行)

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


$ cd veggies2

$ ls -l

drwxr-xr-x   2 user2    users        512 Nov  1 09:11 carrots

$ chmod g+w carrots

$ ls -l

drwxrwxr-x   2 user2    users        512 Nov  1 09:11 carrots

$

上記の例の chmod g+w carrots コマンドは、ファイル carrots に対する書き込み権をこのグループに与えます。グループのアクセス権のハイフン (-) が w に変わっています。

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


$ ls -l

drwxrwxr-x   2 user2    users        512 Nov  1 09:11 carrots

$ chmod o-rx carrots

$ ls -l

drwxrwx---   2 user2    users        512 Nov  1 09:11 carrots

$

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

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

-rw-r--r--

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

drwxr-xr-x

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


$ ls -l turnip

-rw-r--r--   1 user2    users        124 Nov  1 09:14 turnip

$ chmod u+x turnip

$ ls -l turnip

-rwxr--r--   1 user2    users        124 Nov  1 09:14 turnip

$

3 つのカテゴリのすべてのユーザについてアクセス権を変更するには、chmod コマンドに -a オプションを指定します。garlic という新規ファイルの実行権を全ユーザに与えるには、次のように入力します。


$ ls -l garlic

-rw-r--r--   1 user2    users        704 Nov  1 09:16 garlic

$ chmod a+x garlic

$ ls -l garlic

-rwxr-xr-x   1 user2    users        704 Nov  1 09:16 garlic

$

ls -l コマンドの出力に表示されている x は、全ユーザが garlic を実行できることを示します。

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


$ pwd

/home/user2/veggies

$ ls -l

-rwxrwxrwx   1 user2    users       5618 Nov  1 09:18 beets

-rwxrwxrwx   1 user2    users       1777 Nov  1 09:18 corn

-rwxrwxrwx   1 user2    users       3424 Nov  1 09:18 garlic

-rwxrwxrwx   1 user2    users      65536 Nov  1 09:18 onions

$ chmod go-w *

$ ls -l

total 152

-rwxr-xr-x   1 user2    users       5618 Nov  1 09:18 beets

-rwxr-xr-x   1 user2    users       1777 Nov  1 09:18 corn

-rwxr-xr-x   1 user2    users       3424 Nov  1 09:18 garlic

-rwxr-xr-x   1 user2    users      65536 Nov  1 09:18 onions

$

注 –

chmod は、現在のディレクトリでだけ実行してください。


絶対アクセス権の設定

前節では、chmod コマンドを使用してファイルアクセス権を現在の設定に対して相対的に変更する方法を説明しました。chmod コマンドに数字コードを指定することにより、ファイルまたはディレクトリのアクセス権を設定することもできます。

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

chmod numcode name

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

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


$ chmod 771 garlic

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

表 3–2 garlic のアクセス権

アクセス権 

ユーザー 

グループ 

その他のユーザー 

読み取り 

書き込み 

実行 

合計 

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

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


$ ls -l onions

-rwxr-xr-x   1 user2    users      65536 Nov  1 09:18 onions

$ chmod 755 onions

$ ls -l onions

-rwxr-xr-x   1 user2    users      65536 Nov  1 09:18 onions

$

chmod 755 onions と入力すると、ファイル onions のアクセス権を、そのユーザには読み取り、書き込み、実行可能、グループメンバーには読み取りと実行可能、その他のユーザには読み取りと実行可能に設定できます。表 3–3 に、onions に対するアクセス権を設定するのに使用する数値コードを示します。

表 3–3 onion のアクセス権

アクセス権 

ユーザー 

グループ 

その他のユーザー 

読み取り 

書き込み 

実行 

合計 

所有者、グループ、およびその他のユーザ全員にファイル cabbage に対する読み取り、書き込み、および実行の権限を与えるには、次のように指定します。


$ ls -l cabbage

-rw-r--r--   1 user2    users         75 Nov  1 09:28 cabbage

$ chmod 777 cabbage

$ ls -l cabbage

-rwxrwxrwx   1 user2    users         75 Nov  1 09:28 cabbage

$

表 3–4 は、上記の例でアクセス権設定に使用されている数値コードを示しています。

表 3–4 cabbage のアクセス権

アクセス権 

ユーザー 

グループ 

その他のユーザー 

読み取り 

書き込み 

実行 

合計 

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

相対アクセス権の変更の場合と同様に、ワイルドカード文字の * を使って現在のディレクトリ内の全ファイルの絶対アクセス権を設定することもできます。たとえば、次に示すように、現在のディレクトリ内のすべてのファイルについて絶対的なアクセス権を設定するとします。

これらのアクセス権を設定するには、次のように入力します。


$ pwd

/home/user2/veggies

$ ls -l

-rwxrwxrwx   1 user2    users       5618 Nov  1 09:18 beets

-rwxrwxrwx   1 user2    users       1777 Nov  1 09:18 corn

-rwxrwxrwx   1 user2    users       3424 Nov  1 09:18 garlic

-rwxrwxrwx   1 user2    users      65536 Nov  1 09:18 onions

$ chmod 751 *

$ ls -l

-rwxr-x--x   1 user2    users       5618 Nov  1 09:18 beets

-rwxr-x--x   1 user2    users       1777 Nov  1 09:18 corn

-rwxr-x--x   1 user2    users       3424 Nov  1 09:18 garlic

-rwxr-x--x   1 user2    users      65536 Nov  1 09:18 onions

$

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

chmod(1) コマンドについての詳細は、『man pages section 1: User Commands』を参照してください。