Jump to content 日本-日本語

製品  >  ソフトウェア  >  HP-UX   >  Knowledge-on-Demand  >  UNIXの教科書 基礎編

UNIXの教科書
〜はじめよう! WindowsとLinuxからのステップアップ〜

第4日目:ファイルの基本操作

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
第4日目:ファイルの基本操作
UNIXの教科書〜はじめよう! WindowsとLinuxからのステップアップ〜 4日目
ファイルのコピーや移動/削除
ファイルのリンク

2時間目:ファイルのリンク

UNIXには、「リンク」と呼ばれるファイルやディレクトリに別名でアクセスする仕組みがあります。WindowsにおけるショートカットやMac OS Xにおけるエイリアスのようなイメージでとらえるといいでしょう。リンクは「シンボリックリンク」と「ハードリンク」の2種類に大別されます。いずれもlnコマンドを使用して作成します。なお、リンクを作成することを“リンクを張る”と言うことがあります。

四色君:
シンボリックリンクとハードリンクってどっちがよく使用されるのですか?
四色君
マリー先生
マリー先生:
普通にユーザが使用するのはシンボリックリンクがほとんどね。というのは、ハードリンクにはその仕組みから次のような制約があるの。
  • 異なるパーティションにリンクを作成できない
  • ディレクトリのリンクは作成できない

シンボリックリンクを作成する

リンクを張るにはlnコマンドを使用します。cpコマンドの引数の順番と同じく、最初の引数にもとのファイルのパスを指定します。

ln [-s]  もとのファイルのパス リンクのパス

このとき、ハードリンクの場合にはオプションは不要ですが、シンボリックリンクを作成する場合には「-s」オプションを指定します。

たとえば、カレントディレクトリの下にあるoriginal.txtのシンボリックをsymlink.txtとして作成するには、次のようにします。

$ ln -s original.txt symlink.txt

「ls -F」コマンド(もしくはlsfコマンド)で結果を確認すると、シンボリックリンクには最後に「@」が表示されます。

$ ls -F 【Enter】
original.txt   symlink.txt@

また「ls -l」コマンド(もしくはllコマンドでは)では、先頭のファイルタイプのハイフンが「l」となり、最後に「-> リンク先のパス」が表示されます。

$ ls -l  【Enter】
total 256
-rw-r--r--   1 o2         users       128847 Jan 28 17:45 original.txt
lrwxr-xr-x   1 o2         users           11 Jan 28 17:45 symlink.txt -> original.txt
↑                                        ↑                            ↑
シンボリックリンクは「l」                 サイズは小さい                リンク先のパス

シンボリックリンクの実体は、リンク先のファイルまでのパスが格納されたファイルです。そのため、ファイル容量は非常に小さくなっています。

なお、シンボリックリンクを削除する際にはrmコマンドを実行します。rmコマンドはリンク先のファイルではなく,シンボリックリンク自体を削除します。

同じ名前でシンボリックリンクを作成する

lnコマンドの2番目の引数にディレクトリを指定すると、そのディレクトリの下に、同じ名前でシンボリックリンクが作成されます。たとえば、「link1/original.txt」のシンボリックリンクを、link2ディレクトリの下に同じ名前で作成するには次のようにします。

$ ln -s link1/original.txt link2 
$ ls -l link2
total 0
lrwxr-xr-x   1 o2      users         18 Jan 29 17:39 original.txt -> link1/original.txt

タックス君:
使われるのはシンボリックリンクのほうが一般的なのに、ハードリンク作成はオプションなしのlnコマンドで、シンボリックリンク作成に「-s」オプションが必要なのはなぜですか?
逆でもいいのに……。
タックス君
マリー先生
マリー先生:
シンボリックリンクのほうが歴史的に新しい機能だからよ。初期のlnコマンドはハードリンクだけを作成するコマンドだったわけ。
四色君:
リンク先のファイルがなくなってしまったらどうなるのですか?
四色君
マリー先生
マリー先生:
シンボリックリンクはそのまま残るわ。ただし、参照先がないわけだから、たとえばcatコマンドで中身を表示しようとするとファイルが見つからないといったエラーになるの。

$ rm original.txt 
$ cat symlink.txt 
cat: Cannot open symlink.txt: No such file or directory

シンボリックリンクの注意点

シンボリックリンクはリンク先のパスを格納しているだけなので、ディレクトリの階層構造を理解していないと場合によってはおかしなことになるので注意してください。たとえば現在ホームディレクトリにいるときに、その下のoriginal.txtのシンボリックリンクを、workディレクトリの下にsymlink.txtという名前で作成したいとしましょう。

workディレクトリにoriginal.txtのシンボリックリンクを作成したい
図3:workディレクトリにoriginal.txtのシンボリックリンクを作成したい

この場合、次のように、lnコマンドの2番目の引数として「work/symlink.txt」を指定してシンボリックリンクを作成してもうまくいきません。

$ ln -s original.txt work/symlink.txt	←シンボリックリンクは作成できるが
$ cat work/symlink.txt 
cat: Cannot open work/symlink.txt: No such file or directory	←表示しようとすると
                                                                  エラーとなる

というのは、「ls -l」コマンドで結果を確認するとわかりますが、work/symlink.txtは、同じディレクトリ内にoriginal.txtを参照しているからです。

$ ls -l work/symlink.txt 
lrwxr-xr-x   1 o2      users         12 Jan 28 17:58 work/symlink.txt -> original.txt

この場合、最初の引数を「../original.txt」のように、シンボリックリンクからの相対パスで指定する必要があるわけです。

$ ln -s ../original.txt work/symlink.txt
$ cat work/symlink.txt
Hello	←今度はうまくいく

タックス君:
lnコマンドの最初の引数のリンク先を、常に「/home/taro/original.txt」のように絶対パスで指定すれば、問題はありませんよね。
タックス君
マリー先生
マリー先生:
それでもいいけど、ディレクトリを丸ごとコピーしたり、バックアップしたファイルを復元する時に、リンクがおかしくなる場合があるので注意してね。

ハードリンクの作成

続いてハードリンクについて説明しましょう。ハードリンクを作成するにはlnコマンドを「-s」オプションなしで実行します。ハードリンクは、ファイルの“実体”を別名でアクセスする機能です。たとえば、カレントディレクトリの下にoriginal.txtというファイルがあるとしましょう。「ls -l」で確認すると初期状態ではハードリンクの数は「1」です。

$ ls -l original.txt  【Enter】
-rw-r--r--   1 o2         users       128847 Jan 29 16:57 original.txt
            ↑ハードリンクの数は「1」

original.txtのハードリンクをhardlink.txtとして作成するには次のようにします。

$ ln original.txt hardlink.txt 【Enter】

「ls -l」で確認すると、どちらもハードリンクの数は「2」となります。

$ ls -l  【Enter】
total 512
-rw-r--r--   2 o2         users       128847 Jan 29 16:57 hardlink.txt
-rw-r--r--   2 o2         users       128847 Jan 29 16:57 original.txt
            ↑ハードリンクの数は「2」

ハードリンクを作成すると、リンク先、ハードリンクのどちらも同じファイルの実体(ハードディスク上のファイルが保存されている領域)を参照します。この例では、orginal.txtとhadrdlink.txtは、同じファイルの実体を指し示すようになります。つまり、システム的にはどちらも等価で、シンボリックリンクのようにリンク先、リンク元といった区別はありません。

リンク先とハードリンクは同じファイルの実体を指す
図4:リンク先とハードリンクは同じファイルの実体を指す

UNIXシステムでは、ハードディスク上の個々のファイルの実体を「iノード番号」という番号で管理しています。iノード番号は、lsコマンドに「-i」オプションを指定すれば確認できます。次に実行結果を示します。orginal.txtとhadrdlink.txtのどちらも同じiノード番号である点に注目してください。

$ ls -i  【Enter】
236 hardlink.txt     236 original.txt	←iノード番号が同じ

タックス君:
ハードリンクを削除するとどうなるのですか?
タックス君
マリー先生
マリー先生:
ハードリンクにはリンク先とリンク元という区別はないからどちらを削除しても同じよ。同じiノード番号のファイルを削除していって、最終的にハードリンクの数が0になった時点でファイルの実体が削除されるわけ。

ハードリンクがすべて削除されるとファイルの実体も削除される
図5:ハードリンクがすべて削除されるとファイルの実体も削除される
タックス君:
なぜディレクトリのハードリンクは作成できないのですか?
タックス君
マリー先生
マリー先生:
ディレクトリのハードリンクの作成を許可してしまうと、意図せずディレクトリの無限ループが作成される可能性があるからよ。たとえば、「ln /dirA /dirA/linkDir」のように、/dirAディレクトリのハードリンクを/dirA/linkDirに作成できたとしましょう。すると、「/dirA/linkdir/linkdir/linkDir…………」というように無限のディレクトリができてしまっておかしなことになりるわけ。
ただし、システム的にはディレクトリのハードリンクは活躍しているの。
四色君:
というと?
四色君
マリー先生
マリー先生:
前回説明したカレントディレクトリを表す「.」や、ひとつ上のディレクトリを表す「..」は、実はディレクトリのハードリンクなの。たとえば、ディレクトリを作成すると、そのハードリンクの数は「1」ではなく「2」になるわよね。不思議だと思わない?

$ mkdir sample	←sampleディレクトリを作成
$ ls -ld sample/
drwxr-xr-x   2 o2         users           96 Jan 29 17:12 sample/
             ↑ハードリンクの数は「2」

この「.」はそのディレクトリへのハードリンクなの。lsコマンドで、iノード番号を確認するとわかるわよ。

$ ls -lid sample/
   310 drwxr-xr-x   2 o2      users         96 Jan 29 17:12 sample/
   ↑iノード番号は「310」
$ ls -lia sample/
total 0
   310 drwxr-xr-x   2 o2      users         96 Jan 29 17:12 .
   235 drwxr-xr-x   3 o2      users         96 Jan 29 17:12 ..
   ↑「.」のiノード番号は「310」

同じように、「..」はひとつ上のディレクトリへのハードリンクなの。

「.」や「..」はハードリンク
図6:「.」や「..」はハードリンク

ディレクトリの下にディレクトリを作成していくと、ディレクトリのハードリンクの数がどのように増えていくかを実際に実行して確認してみてね。

練習問題

第1問:ホームディレクトリの下のworkディレクトリを、カレントディレクトリの下の2008ディレクトリの下に、もとの情報を保ったまま、まるごとコピーするコマンドはどれか?

a) cp -p ~/work 2008
b) cp -pr ~/work 2008
c) cp -pi ~/work 2008
d) mv -r ~/work 2008
正解はこちら
b) cp -pr ~/work 2008
「-r」はディレクトリを丸ごとコピーするオプション。「-p」はもとのファイルの情報を保持するオプション。

第2問:カレントディレクトリの下のnews.htmlを、ひとつ上のディレクトリへ移動するコマンドはどれか?

a) mv news.html ..
b) mv news.html .
c) rm news.html ..
d) mv new.html ../..
正解はこちら
a) mv news.html ..
1つ上のディレクトリに移動するにはmvコマンドの、2番目の引数に「..」を指定すればよい。

第3問:backupディレクトリの下の拡張子が3文字のファイルを、確認しながら削除するコマンドはどれか?

a) rm bakup/*
b) rm -i backup/.???
c) rm -p bakup/*.???
d) rm -i backup/*.???
正解はこちら
d) rm -i backup/*.???
「-i」は確認しながら削除するオプション。拡張子が3文字のファイルは「*.???」で表記できる。

第4問:1つ上のディレクトリの下のinfo.htmlのシンボリックリンクを、カレントディレクトリに同じ名前で作成するコマンドはどれか?

a) ln .. /info.html
b) ln -s ../info.html .
c) ln ../info.html ..
d) ln .-s info.html ..
正解はこちら
b) ln -s ../info.html .
シンボリックリンクを作成するには、lnコマンドを「-s」オプションを指定して実行する。

連載記事一覧 戻る 1  |  2

教科書シリーズ 「UNIXの教科書」 「HAクラスターの教科書」 連載記事一覧

UNIXの教科書「基礎編」

第1日目:ログインしてコマンドを実行してみる
第2日目:ディレクトリやファイルを操作してみる
第3日目:シェルの基本を知る
第4日目:ファイルの基本操作
第5日目:viエディタの操作(基本編)
第6日目:リダイレクションとパイプを活用する
期末試験

UNIXの教科書「応用編」

第1日目:grepコマンドと正規表現
第2日目:ファイルの検索
第3日目:viエディタの操作(活用編)
第4日目:ファイルの圧縮とアーカイブ
第5日目:ジョブとプロセスの操作
第6日目:シェルの環境設定
第7日目:シェルスクリプトでより便利に
期末試験

UNIXの教科書「運用編」

第1日目:ユーザーの管理
第2日目:ファイルの安全管理(その1)
第3日目:ファイルの安全管理(その2)
第4日目:ネットワークの基本を理解する
第5日目:ネットワーク関連のコマンド
第6日目:システム情報の表示
期末試験 New!

HAクラスターの教科書

第1日目:ハードウェア構成を知る
第2日目:ネットワークを設定する
第3日目:共有ディスクを構成する
第4日目:HAクラスターを構成する
第5日目:パッケージを構成する
第6日目:障害テストを実施する
期末試験

 その他の連載記事


本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

オンラインサポート
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項