web-dev-qa-db-ja.com

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

ターゲットがファイルではなくシンボリックリンクであることを知っているとすると、rmunlinkを使用してリンクを削除することに違いはありますか?

62
IQAndreas

POSIXは、unlinkユーティリティがCライブラリのunlink関数のみを呼び出すことを指定しています。オプションはありません。ディレクトリではないものに有効なパス名を渡し、そのオブジェクトが存在するディレクトリへの書き込み権限がある場合、unlinkはそれを削除します。

rmは、他のビット機能を備えた従来のUnixコマンドであり、unlinkのスーパーセットではありません(以下を参照)。

まず、rmは安全性チェックを実行します。書き込み権限がないオブジェクトをrmしようとした場合(オブジェクトを削除する機能には関係ありません。それを含むディレクトリの権限は!)rmそれでも_-f_が指定されています。 rmは通常、ファイルが存在しない場合に文句を言います。unlinkも同様です。ただし、_-f_では、rmは文句を言いません。これは、Makefiles(clean: @rm -f $(OBJS) ...)で悪用されることが多いため、削除するものが何もない場合でも_make clean_は失敗しません。

次に、rmには、インタラクティブに削除を確認するための_-i_オプションがあります。

第3に、rmには、ディレクトリを再帰的に削除するための_-r_があります。これは、Cライブラリ関数がそれを行わないため、unlinkが行う必要のないことです。

unlinkユーティリティは、完全に削除されたrmではありません。rmが行うことのサブセットを実行しますが、 rmwith _-f_とrm without _-f_の組み合わせ。

独自の権限に関係なく、通常のファイルを削除したいとします。さらに、ファイルが存在しない場合、またはその他の理由でコマンドを失敗させたい場合どちらでもない_rm file_も_rm -f file_も要件を満たしていません。 _rm file_は、ファイルが書き込み可能でない場合、拒否します。しかし、_rm -f file_は、ファイルが欠落している場合でも文句を言うことを怠ります。 _unlink file_が仕事をします。

unlinkはおそらくrmが賢すぎるために導入されました:純粋なUnixが必要な場合がありますunlinkセマンティクス: "このディレクトリエントリを作成してくださいディレクトリのアクセス許可で許可されている場合は削除してください "

26
Kaz

単一ファイルの場合、 rm および unlink は同じタスクを実行し、ファイルを削除します。 POSIXで定義されているように、rmunlinkはどちらも unlink() システムコールを呼び出します。

GNU rmでは、 unlinkat() システムコールを呼び出します。これはunlink()または rmdir() 関数は、パスが相対パスを指定する場合を除きます。

一部のシステムでは、unlinkもディレクトリを削除できます。少なくともGNUシステムでは、unlinkはディレクトリの名前を削除できません。

20
cuonglm