はじめに
unlink
コマンドはハードリンクを削除するコマンドです。コマンド名に link と入っているから勘違いしている人がいるようですがシンボリックリンクを削除するために作られたコマンドではありません。unlink
コマンドの反対は link
コマンドです。
link
コマンドはハードリンクを作成します。その反対なので unlink
コマンドはハードリンクを削除するコマンドと言って良いでしょう。リンクを削除してどこからもリンクされなくなったファイルは消えるのでunlink
コマンドはファイルも削除します。シンボリックリンクファイルもファイルなので削除されます。
link/unlink はシステム管理者用のコマンド
link
/unlink
はシステム管理コマンドです。本来は一般ユーザー用ではありません。Solaris 11 では /usr/sbin
以下にあります。
$ which link unlink
/usr/sbin/link
/usr/sbin/unlink
$ which rm
/usr/bin/rm
/usr/bin/ln
Linux などでは一般ユーザー用コマンドとして扱われているような気がしますが。
GNU unlink のドキュメントによると、一部のシステムでは unlink
コマンドはディレクトリを削除することが出来ます。別のシステムでは特権ユーザーでなければ unlink
コマンドを実行することは出来ません。GNU 版はディレクトリを削除することありません。
On some systems unlink can be used to delete the name of a directory. On others, it can be used that way only by a privileged user. In the GNU system unlink can never delete the name of a directory.
rm を使ったほうが安全
Solaris は rm を使ったほうが安全と言っています。
While linked files and directories can be removed using unlink, it is safer to use rm(1) and rmdir(1) instead. See rm(1) and rmdir(1).
訳 リンクされたファイルやディレクトリは unlink を使って削除できるが、代わりに rm(1) や rmdir(1) を使った方が安全である。rm(1) と rmdir(1) を参照のこと。
シンボリックリンクの削除には rm
コマンドを使います。オプションを何も指定しなければ、rm
コマンドでシンボリックリンクを消そうとしてシンボリックリンク先のファイルが消えたりすることはありません。rm
コマンドには「削除してもよろしいですか?」と確認する機能がついています。その時に削除対象が通常のファイルかシンボリックリンクかも教えてくれます。ファイルごとに確認されるのがウザいなら -i
の代わりに -I
を使いましょう。正しく使えば rm
コマンドは unlink
コマンドよりも安全です。
rm
コマンドを使う時に、何も考えずに -r
や -f
オプションを付ける癖はなくしましょう。シンボリックリンクファイルを消す時に -r
がいらないのはすぐに分かりますよね?なんでも -f
を付けているとせっかくの削除時の確認機能が無意味なものになってしまいます。確認メッセージを読まずに「はい」「はい」「はい」とクリックしているのと同じことです。オプションの意味を知って、必要なときだけ指定するようにしましょう。
シンボリックリンクの削除は unlink のほうが安全という謎理論
この理論を唱えている人は、unlink
コマンドをシンボリックリンクを削除するコマンドだと勘違いしています。
なぜなら、もし勘違いしていないなら「ファイルの削除には rm
コマンドよりも unlink
コマンドを使ったほうが安全」と言っているはずだからです。
ファイルの削除に rm
コマンドを使っていながら、シンボリックリンクの場合だけ(ファイルを削除する) unlink
コマンドを使うというのではおかしな話ですね。
結局のところ、必要ないのに -r
オプションを付けるなという話です。
さいごに
使いたいのなら unlink
でシンボリックリンクを削除しても構いませんが、unlink
はハードリンクを削除するシステム管理コマンドで通常のファイルまでも消してしまうコマンドです。