うめすこんぶ

日々のプログラミングで残しておきたいメモ.何かの役に立てれば幸いです.

ハードリンクとシンボリックリンクの違い

スポンサーリンク

ファイルを別の場所にコピーしたい時ってよくあります。 でも、単にコピーするのではなく、リンクを作ってやると、ファイルの複製処理が要らないし、 容量も増えないのでお得です。

LinuxMacでは、リンクの仕方に二種類あります。リンク方法によってやってることが結構違うので注意! ちなみに、Windowsでは皆さん馴染み深いショートカットを使いますね。(中身の仕様は違うと思いますが)

ハードリンク

ハードリンクは、元ファイルに別名を付けます。

コマンドは以下。

ln 元ファイル名 リンク先ファイル名

例:ln ~/foo.txt ~/tmp/foo_hard.txt

例では、既存のfoo.txtに新しいfoo_hard.txtという名前をつけてリンクを作っています。 普通のコピーと違い、foo.txtを編集したらfoo_hard.txtも更新されます。 これは、2つのファイルの指す実体が同じだからです。

シンボリックリンク

コマンドは以下。

ln -s 元ファイル名 リンク先ファイル名

例:ln -s ~/foo.txt ~/tmp/foo_simbolic.txt

シンボリックリンクを作った後、ls -lでリンクがどうなってるか見てみます。

$ls -l
lrwxr-xr-x  1 user  staff  21 11  9 20:37 foo_simbolic.txt -> /Users/user/foo.txt

リンク元のファイルが"->"で示されているのがわかります。ハードリンクの時は、こうゆう表示にはなりません。

シンボリックリンクも同じように、お互いに編集結果が反映されます。 しかし、ハードリンクと大きな違いは、

  • メリット:ディレクトリに対してリンクを作ることができますが、
  • デメリット:リンク元を消すと、No such file or directoryと言われます!

ハードリンクはリンク元もリンク先も同じ扱いだったのが、シンボリックリンクですと主従関係が生まれてますね。 シンボリックリンクのほうがLinuxだとよく使われているそうです。

参考