web-dev-qa-db-ja.com

unlinkとrmの違いは何ですか?

リンク解除はrmより高速ですか?

64
Marcin

どちらもunlink()システムコールである同じ基本的な関数のラッパーです。

ユーザーランドユーティリティ間の違いを比較検討します。

rm(1)

  • より多くのオプション。
  • より多くのフィードバック。
  • 健全性チェック。
  • 上記の結果として、単一の呼び出しでは少し遅くなります。
  • 同時に複数の引数で呼び出すことができます。

unlink(1)

  • 健全性チェックが少ない。
  • ディレクトリを削除できません。
  • 再帰できません。
  • 一度に1つの引数しか取ることができません。
  • シンプルであるため、シングルコールの方がわずかにリーンです。
  • rm(1)に複数の引数を指定する場合と比較すると、速度が遅くなります。

あなたは違いを示すことができます:

_$ touch $(seq 1 100)
$ unlink $(seq 1 100)
unlink: extra operand `2'

$ touch $(seq 1 100)
$ time rm $(seq 1 100)

real    0m0.048s
user    0m0.004s
sys     0m0.008s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do rm $i; done

real    0m0.207s
user    0m0.044s
sys     0m0.112s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do unlink $i; done

real    0m0.167s
user    0m0.048s
sys     0m0.120s
_

しかし、システムunlink(2)関数への純粋な呼び出しについて話している場合、私が今気付いているのは、おそらくあなたが説明しているものではないことです。

システムunlink()は、ディレクトリとファイルの両方で実行できます。しかし、ディレクトリが他のディレクトリやファイルの親である場合、その親へのリンクは削除されますが、子はぶら下がったままになります。これは理想的ではありません。

編集:

申し訳ありませんが、unlink(1)unlink(2)の違いを明確にしました。意味論は依然としてプラットフォーム間で異なるでしょう。

69
Dan Carley

POSIX仕様レベルでは、 rm の動作は nlink の動作よりもはるかに厳密に指定されています。

スクリプトがOS全体で実行される必要がある場合、結果の移植性はrmを使用したほうがよいようです。

8
Mike G.

削除の遅い部分は、ファイルシステムのコードとディスクに関するものであり、unlink()システムコールのユーザースペースの準備ではありません。

つまり、速度の違いが問題になる場合は、データをファイルシステムに保存しないでください。

unlinkはrm "light"です。 rmにはより多くの機能がありますが、同じことを行います。

4
Thomas