🍔

linuxコマンド "ln" と "cp" の違い

2021/06/08に公開
3

"ln"はリンクを作成するLinuxコマンド。調べたらこれが出てきたので今日初めて使ってみました。これって普段使ってる”cp”とあんまり変わらなくない?という疑問にアンサー!

cplnの型

どちら基本的な型は同じ。

% cp コピーしたいもの コピーされるもの 
% ln リンクしたいもの リンクされるもの 

cp は 同じものを作成、 lnは ただ参照

ただその間には微妙なニュアンスがある。

上記の例をとってみると、Linuxは"コピーしたいもの"と"コピーされるもの"はそれぞれ別物とみなす。 一方で"リンクしたいもの"と"リンクされるもの"は実体として同じ扱い。

その他の大きな違いはそれぞれに適応されるオプション。

SOTD

cpはある変数に他の変数の値を代入するイメージで、lnはある変数の値だけを置き換えるイメージ。

Reference

https://qiita.com/jinnai73/items/3fdb841465cf200dda87

Discussion

坦々狸坦々狸

初心者向け記事ということなのでわざと書いてないのかも知れないですが

% ln リンクしたいもの リンクされるもの 

で記事中に例示されているのはハードリンクの作り方になります
これは簡単にいうと実体に対するファイル名情報をディレクトリに記録する動きになります。

% ln -s リンクしたいもの リンクされるもの 

それに対して上記で作るとシンボリックリンク(ソフトリンク)になります
これは新たなファイルを作ってそこに参照先のパスを記録する動きになります。

ハードリンクはその性質上同一ファイルシステム上にしか作れないという制約があり
またiノードが持っているメタ情報を共有したりと環境依存が強いため専らシンボリックリンクの方が使われる印象です。
(パッケージインストール時に/share配下に置いた実行ファイルを/binにリンクとかしてるパッケージとか多いですがこれにハードリンクするとパーティション分けてるだけでインストールが失敗したりする)

なのでハードリンクかシンボリックリンクかを意識して使わないのであればとりあえずシンボリックリンクを使ったほうが問題は起きにくいのでシンボリックリンクを使って下さい。

ちなみに私の知っているシンボリックリンクを上手に活用しているなと思う例はupdate-alternativesコマンドですね

http://ja.manpages.org/update-alternatives/8

PATHに渡るコマンドの実体をシンボリックリンクで上手いこと切り替えています

それに対してハードリンクの上手な活用はあまり思い浮かびません
強いて言うならrdfindコマンドがオプション指定で重複ファイルをハードリンクに置き換えれるので
ファイルサーバ等でディスク容量を圧迫しているときに使うと容量を節約できる可能性がある程度の使い道しか思い浮かばないです。
(ファイルシステムによっては重複排除機能が付いているものもあるのでその場合は無意味)

AmetaAmeta

本記事よりためになる情報をありがとうございます!勉強になります!笑 
なるほど、なぜかシンボリックリンクを扱っている記事が多かったのにはそのような背景があったのですね。
ご教授いただいた通り、今後はシンボリックリンクを使いたいと思います。ありがとうございます!