解決策 1:
どちらも unlink()
である同じ基本関数へのラッパーです システムコール。
ユーザーランドユーティリティの違いを比較検討するため。
rm(1)
:
- その他のオプション
- その他のフィードバック
- 健全性チェック
- 上記の結果として、1 回の呼び出しが少し遅くなります。
- 同時に複数の引数で呼び出すことができます。
unlink(1)
:
- サニティチェックが少ない
- ディレクトリを削除できません。
- 再帰できません。
- 一度に 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)
.セマンティクスはプラットフォーム間で依然として異なります。
解決策 2:
POSIX 仕様レベルでは、rm の動作は unlink の動作よりも厳密に指定されています。
スクリプトを複数の OS で実行する必要がある場合、結果の移植性は rm を使用した方が良いようです。
解決策 3:
削除の遅い部分は、unlink() システム コールのユーザー空間の準備ではなく、ファイル システム コードとディスクのものです。
つまり:速度の違いが重要な場合は、ファイル システムにデータを保存するべきではありません。
unlink は単なる rm "light" です。 rm にはより多くの機能がありますが、機能は同じです。