JP / EN

広告

"unlink: cannot unlink 'link/': Is a directory" unlinkにスラッシュを付けてはいけない

タグ:linux

あるときlinkerなる名前のシンボリックシンクをunlinkで削除しようと sudo unlink linker/ なるコマンドを実行したら unlink: cannot unlink 'link/': Is a directory というエラーになってしまった。
エラーメッセージがわかりにくいのだが、これはリンク名の後に/ スラッシュ を付けてしまったことが原因である。 この正しいコマンドは sudo unlink linker となる。

実行例:
    # 実験用ディレクトリとリンクを作る
    $ mkdir target
    $ sudo ln -s target linker

    # unlinkする
    $ sudo unlink linker/
    unlink: cannot unlink 'linker/': Is a directory  # 失敗
    $ sudo unlink linker
    # これで削除に成功
  


より詳細:unlinkはファイルは消せディレクトリは消せない

manによればunlinkとは

unlink() はファイルシステム上の名前を削除する。 もしその名前がファイルへの最後のリンク (link) であり、 どのプロセスもそのファイルをオープン (open) していなければ、 ファイルは削除される。 ファイルが使用していたディスク上の領域は再利用が可能になる。 [中略] 名前が指しているのがシンボリックリンクなら、そのリンクを削除する。

というコマンドなのだ。 おなじみの削除コマンドrmは内部的にはunlinkを呼んでおり、ラッパー的にディレクトリへの再帰操作などの ユーティリティ機能を足したものである。
では"unlink: cannot unlink 'linker/': Is a directory"というメッセージは何なのか。これは
  • linker: シンボリックリンク
  • linker/: シンボリックリンクが差すディレクトリ (== target/)
とツール内部で呼び分けているということで、「あれ、linker/はディレクトリじゃないか!inlinkでは消せないよ」 とこのようなエラーメッセージが出ているというわけである。 もしディレクトリがunlinkで削除できるとしていたら、これで実体ディレクトリ(上の例ならtarget/)を 削除できていたことだろう(危ない)。 これがディレクトリに関しては安全機構として働いているものの、 うっかりリンクだと思ってファイル本体をunlinkしてしまうことはまれにある失敗であるから 気を付けたい。

おすすめ記事

Linuxでまだマウントしていないディスクはparted -lで探す

Linuxコマンドでディレクトリのフラット化 (flatten)



このエントリーをはてなブックマークに追加

https://wonderhorn.net/