ファイルとディレクトリの作業、編成、管理は、SunOS コマンドを使って行えます。特定の操作を行うには、ファイルやディレクトリを指定して SunOS コマンドを実行します。コマンド行の操作は、デスクトップのファイルマネージャとは異なります。ファイルマネージャでは、ファイルはマウスクリックや移動が可能なアイコンとして表示され、コマンドはメニューから選択できます。
この章の内容は次のとおりです。
ファイルは、SunOS オペレーティングシステムの基本的な単位です。次に示す要素を始めとして、ほとんどあらゆるものがファイルとして扱われます。
ドキュメント – これには、手紙やレポートのようなテキストファイル、コンピュータのソースコードなど、ユーザが書き込みや保存を行うあらゆるドキュメントが含まれます。
コマンド — ほとんどのコマンドは実行可能ファイル (特定のプログラムを起動するために実行されるファイル) です。たとえば、第 2 章で説明した date コマンドは、現在の日付を出力するプログラムを起動するための実行可能ファイルです。
次の節では、ファイルの作成、一覧表示、コピー、移動、削除に利用できるコマンドについて説明します。また、ファイル内容を表示する方法やファイルの特性を確認する方法などについても述べています。
この節の各コマンド説明には、その使用例が示されています。本文を読みながら、これらの例を試してください。
ファイル操作を行う前に、ホームディレクトリにいることを確認してください。ホームディレクトリは、ユーザアカウントの作成時にシステム管理者によって作成されます。ほかのユーザに影響を与える変更を避けるには、自分のホームディレクトリ内で以下の作業を実行してください。
ホームディレクトリにいることを確認するため、cd (change directory) コマンドを入力します。このコマンドを実行すると、自分のホーム (デフォルト) ディレクトリに移動します。次に pwd (print working directory) コマンドを入力して、ファイルシステム内での現在位置を表示します。このとき表示されるディレクトリが各ユーザのホームディレクトリです。
$ cd $ pwd /export/home/username |
上記の例では、ユーザのホームディレクトリは /export/home/username です。username は、このホームディレクトリを所有しているユーザの名前です。
空のファイルを作成するには、touch コマンドを使います。
$ touch tempfile $ |
名前を指定したファイルが存在しない場合、touch コマンドが空のファイルを作成します。
ファイルが存在する場合は、最終アクセス時間が更新されます。
ファイルが作成されたことを確認するために、ls コマンドを使ってファイル名を表示します。
$ ls tempfile tempfile |
ls コマンドを引数なしで入力すると、現在のディレクトリ内のファイルの一覧が表示されます。特定のファイル名を指定して ls コマンドを入力すると、そのファイルが存在する場合は指定されたファイルだけが表示されます。
ファイル表示の詳細は、ls(1) のマニュアルページを参照してください。
tempfile を copyfile というファイルにコピーするには、cp コマンドを使います。
$ cp tempfile copyfile $ |
ここで両方のファイルの一覧を表示してみましょう。どちらのファイル名も「file」という文字列で終わることに注目してください。任意の 1 文字または文字列を表すには、ワイルドカード文字のアスタリスク (*) が使えます。したがって、ls *file というコマンドを入力すると、tempfile と copyfile の両方が表示されます。この場合、現在のディレクトリ内にほかに file で終わる名前のファイルがあれば、そのファイルも表示されます。
$ ls *file copyfile tempfile |
copyfile が最初に表示されることに注意してください。ファイルはアルファベット順に表示されます。ただし、大文字と数字は小文字より先に表示されます。
ファイルのコピーについての詳細は、cp(1) のマニュアルページを参照してください。
mv (move) コマンドを使って、ファイルの移動とファイル名の変更が行えます。次の例では、mv コマンドを使ってファイル名を tempfile から emptyfile に変更しています。
$ mv tempfile emptyfile $ |
上記の変更を確認するために、両方のファイルのリストを再表示します。
$ ls *file copyfile emptyfile |
tempfile が emptyfile で置き換えられます。
ファイルの移動と名前変更の詳細は、mv(1) のマニュアルページを参照してください。
rm (remove) コマンドを使って copyfile を削除し、ls コマンドでその結果を確認します。
$ rm copyfile $ ls *file emptyfile |
rm コマンドの使用には注意を払ってください。特に、ワイルドカード文字 (*) を指定してこのコマンドを使用する場合は細心の注意を払う必要があります。rm を使用して削除したファイルの復元は行えません。
rm(1) コマンドについての詳細は、『man pages section 1: User Commands』を参照してください。
ファイルの内容を表示するには、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 * myscript: executable shell script print.ps: PostScript document save.txt: ascii text |
この節では、ファイルの管理や整理のために Solaris オペレーティング環境で使用するディレクトリ階層について説明します。
ファイルはディレクトリにまとめられますが、ディレクトリも階層構造になっています。この階層の最上位は「ルート」ディレクトリと呼ばれ、「/」で表されます。
次の図 3–1 の例では、ファイルシステム内のディレクトリごとに多数のサブディレクトリがあります。文字「/」は、ディレクトリのレベルを識別するために使用されます。/ (ルート) ディレクトリには、/usr、/bin、/export/home、/lib というサブディレクトリなどがあります。さらに /export/home サブディレクトリには、user1、user2、user3 などのサブディレクトリがあります。
コマンドを実行するには、その対象となるファイルまたはディレクトリを含むディレクトリを指定する必要があります。指定されるディレクトリの下に存在するディレクトリとファイルの名前は、区切り文字であるスラッシュで結合されてパス名を形成します。たとえば、次の図の user3 ディレクトリのパス名は /export/home/user3 です。
同一ディレクトリ内のすべてのサブディレクトリとファイルの名前は一意でなければなりませんが、ディレクトリが異なればこれらの名前が同じであってもかまいません。たとえば、/usr ディレクトリには /usr/lib というサブディレクトリがあります。/usr/lib と /lib ではパス名が異なるため、これらの名前に重複はありません。
ファイルのパス名の機能は、ディレクトリのパス名とまったく同じです。ファイルのパス名は、ファイルシステム階層におけるそのファイルの位置を表します。たとえば、/export/home/user2 ディレクトリに report5 というファイルが存在する場合、このファイルのパス名は /export/home/user2/report5 となります。このパス名は、ファイル report5 はディレクトリ user2 の中にあり、user2 はディレクトリ home の中にあり、home はルート (/) ディレクトリの中にあることを示しています。
pwd (print working directory) コマンドは、ファイルシステム階層内でのユーザの現在位置を表示します。
$ pwd /home/user1 |
実際の出力は、ディレクトリ構造の違いのためにこの例とは異なることがあります。作業用ディレクトリが、ファイルシステム階層内でのユーザの現在位置となります。
各ユーザはホームディレクトリを持っています。端末またはウィンドウを始めて開いたときには、最初の位置がホームディレクトリになります。ホームディレクトリは、ユーザアカウントの作成時にシステム管理者によって作成されます。
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 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 veggies3 $ |
ディレクトリにファイルやサブディレクトリが含まれている場合、rmdir コマンドではディレクトリは削除できません。
ディレクトリとそのすべての内容 (すべてのサブディレクトリおよびファイル) を削除する場合は、再帰的削除を指示する -r オプションを指定して rm コマンドを実行します。
$ rm -r veggies3 $ |
rmdir コマンドで削除したディレクトリは復元できません。rm -r コマンドで削除したディレクトリとその内容についても同様に復元できません。
似ているファイル間の違いを確認するには diff コマンドを使用します。次のコマンドは leftfile と rightfile の各行を走査して相違点を表示します。
$ diff leftfile rightfile |
異なる行が見つかると、diff はその相違の原因 (行の追加、削除、または変更) と影響を受けた行を調べ、各ファイル内の個々の相違箇所の行番号と該当テキストを表示します。
相違の原因が行の追加による場合、diff は次の形式で行番号を表示します。
l[,l] a r[,r] |
l は leftfile の行番号、r は rightfile の行番号です。
相違の原因が行の削除による場合は、上記の 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 コマンドを使用します。
$ diff3 file1 file2 file3 |
diff3 コマンドはファイルの 3 つのバージョンを比較し、内容が異なる範囲に以下のコードを付加して表示します。
==== 3 つのファイルがすべて異なる
====1 file1 がほかの 2 つと異なる
====2 file2 がほかの 2 つと異なる
====3 file3 がほかの 2 つと異なる
大きなファイルを比較する場合は、diff の代わりに bdiff コマンドを使います。bdiff の使用方法は、diff コマンドと同じです。
$ bdiff leftfile rightfile |
3500 行を超えるファイルでは、diff ではなく bdiff を使ってください。
find コマンドを使うと、指定した条件に合致するファイル名の検索を、特定のディレクトリから開始できます。たとえば、特定のパターンに一致するファイル名や一定の期間内に変更されたファイル名などを検索できます。
ほかの大部分のコマンドとは違って、find のオプションはいくつかの文字からなり、コマンド行ではオプションより前に、検索を開始するディレクトリ名を指定する必要があります。
$ find directory options |
directory は検索を開始するディレクトリの名前、options は find コマンドのオプションです。
各オプションは、ファイルの選択基準を指定します。選択されるファイルは、すべての基準を満たしている必要があります。指定するオプションの数が多くなるほど、選択されるファイルの範囲は狭くなります-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 を単一引用符 (`) で囲みます。 |
userid が所有しているファイルを選択します。userid はログイン名、ユーザ ID 番号のどちらでもかまいません。 |
|
group に属するファイルを選択します。 |
|
n 日前に変更されたファイルを選択します。 |
|
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) のマニュアルページを参照してください。
ファイルのアクセス権は、ファイルとディレクトリを許可なく読み書きされないように保護します。ほかのユーザに対してファイルの読み取りは許可しても変更は許可したくない場合があります。また、実行可能ファイル (プログラム) を共有したい場合もあります。このような場合、ファイルのアクセス権を利用して、ファイルに対するアクセスを管理できます。
ファイルとディレクトリに関する基本的なアクセス権の種類は次のとおりです。
r – 読み取り権。ファイルの内容を参照したりコピーしたりするには、その ファイルが読み取り可能でなければなりません。また、ディレクトリの内容を表示するには、そのディレクトリが読み取り可能でなければなりません。
w – 書き込み権。ファイルを変更、削除したり、ファイル名を変更するには、そのファイルが書き込み可能でなければなりません。また、ディレクトリ内のファイルを追加したり削除したりするには、そのディレクトリが書き込み可能でなければなりません。
x – 実行権。実行権付きのファイル (プログラムなど) は実行することができます。ユーザがディレクトリの任意のサブディレクトリにアクセスするには、そのディレクトリが実行可能でなければなりません。
アクセス権の設定対象となるユーザは、次の 3 つに分類できます。
ファイルとディレクトリの詳細一覧をアルファベット順に出力するには、-l を指定して ls コマンドを実行します。
各行の最初の文字は、ファイル形式を示します。ダッシュ (-) は通常ファイル、d はディレクトリ、その他の文字はほかの特殊なファイル形式を表します。
次の 9 文字は、ファイルやディレクトリのアクセス権を示します。これら 9 文字は、3 文字ずつの 3 つのグループから構成され、それぞれ所有者、所有者のグループ、その他の全ユーザのアクセス権を表します。たとえば、emptyfile のアクセス権は、rw-r--r-- となっています。このファイルの場合、所有者は読み取りと書き込みが行え、その他のすべてのユーザは読み取りだけは行えますが、どのユーザも実行はできません。また、ディレクトリ veggies2 のアクセス権は、rwxr-xr-x となっています。このディレクトリの場合、どのユーザでも読み取りと実行が行えますが、書き込みが行えるのは所有者に限られます。
ファイルのアクセス権の他に、上記のリストには次の情報が含まれています。
ファイルやディレクトリに対するリンクの数
所有者の名前 (この例では user2)
グループ所有者の名前 (この例では users)
ファイルやディレクトリの最新更新日付と時間
ファイルやディレクトリの名前
cd コマンドを使って自分のホームディレクトリに移動し、ls -l コマンドを入力してみてください。
次に、以下のように入力してみてください。dirname には、使用しているファイルシステムに実際に存在するディレクトリの名前を指定します。
$ ls -l dirname |
ディレクトリ名を指定すると、ls -l コマンドは、そのディレクトリ内にあるディレクトリとファイルに関する情報を出力します。
ls コマンドで表示されないファイルもあります。これらのファイルは、.cshrc、.login、.profile のように . (ドット) で始まる名前を持っています。 このようなドットファイルを表示するには、ls -a コマンドを使います。
$ ls -a . .. .cshrc .login .profile emptyfile |
. で始まるファイルは、他のファイルよりも前に表示されることに注意してください。. ファイルは現在のディレクトリを示し、.. ファイルは親ディレクトリを示します。
一般に、. で始まるファイルはシステムユーティリティによって使われ、通常はユーザが変更するものではありません。この規則には例外もいくつかあります。
ファイルやディレクトリのアクセス権を変更する場合は、chmod コマンドを使います。アクセス権を変更するには、そのファイルやディレクトリの所有者であるか、root にアクセスできる必要があります。chmod コマンドの一般的な形式は次のとおりです。
chmod permissions name |
permissions は変更用のアクセス権、name は影響を受けるファイルやディレクトリの名前を示します。
アクセス権を指定するには、いくつかの方法があります。ここでは簡単な方法を紹介します。
次の文字のどれかを使ってユーザのタイプを指定します。
u (所有者)
g (グループ)
o (ほかのユーザ)
a (上記 3 つのカテゴリの全ユーザ)
アクセス権を付加するか (+) 除去するか (-) を指定します。
次のいずれかの文字を使ってアクセス権を指定します。
次の例では、carrots ディレクトリに対する書き込み権を、同じグループに属するユーザに付与しています (つまり permissions は g+w、name は carrots)。
$ 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 numcode name
この例では、numcode は数値コード、name はアクセス権が変更されるファイルやディレクトリの名前です。
数値コードは、3 つの数字からなります。1 つの数字が 3 つのユーザカテゴリ (所有者、グループ、他のユーザ) の各々に適用されます。たとえば、次のコマンドは、所有者とグループに対して読み取り権、書き込み権、実行権の絶対アクセス権を設定し、ほかのユーザに対して実行権だけを設定しています。
$ chmod 771 garlic |
表 3–2 は、garlic のアクセス権が 771 というコードによってどのように表現されるかを示しています。
表 3–2 garlic のアクセス権
アクセス権 |
ユーザー |
グループ |
その他のユーザー |
---|---|---|---|
読み取り |
4 |
4 |
0 |
書き込み |
2 |
2 |
0 |
実行 |
1 |
1 |
1 |
合計 |
7 |
7 |
1 |
表 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 のアクセス権
アクセス権 |
ユーザー |
グループ |
その他のユーザー |
---|---|---|---|
読み取り |
4 |
4 |
4 |
書き込み |
2 |
0 |
0 |
実行 |
1 |
1 |
1 |
合計 |
7 |
5 |
5 |
所有者、グループ、およびその他のユーザ全員にファイル 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 のアクセス権
アクセス権 |
ユーザー |
グループ |
その他のユーザー |
---|---|---|---|
読み取り |
4 |
4 |
4 |
書き込み |
2 |
2 |
2 |
実行 |
1 |
1 |
1 |
合計 |
7 |
7 |
7 |
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』を参照してください。