web-dev-qa-db-ja.com

なぜrmdir -rfではなくrm -rfなのですか

ディレクトリ内のすべてを削除するコマンドがrm -rf

rmdirで同じことをするフラグがないのはなぜですか?

ディレクトリ操作にrmdirを使用する方が直感的ではないでしょうか?

13
kouroshk

初期のUnixファイルシステム(少なくとも1970年頃のV7時代)では、ディレクトリは特殊ファイルとして実装され、ルートのみがそれらを作成したmknod(2)システムコールを使用でき、ルートのみがunlink(2)できました。ディレクトリ特殊ファイル。

これらの保護は、ファイルシステム構造の一貫性を保つために導入されました。たとえば、ユーザーがディレクトリ特殊ファイルへの書き込みを許可されている場合、その親ディレクトリを..が自分自身(具体的には自分のiノード)を指すようにすることができます。これはファイルシステムに循環参照を作成し、それが悪いことになります。もちろん、他にも矛盾が生じる可能性がありますが、これは明確な例にすぎません。

一貫性は、mkdir(1)rmdir(1)などのSet-UIDルートであるユーザースペースプログラムによって維持され、非特権ユーザーに代わって特権システムコールを実行できるようになりました。再帰がrm(1)に追加された場合、削除コマンドは現在のUIDとして実行され、空のディレクトリを削除するためだけにrmdir(1)を呼び出します。これは、依然として権限昇格のかなり標準的な方法です。必要以上の権限を使用しないでください。

後でmkdir(2)rmdir(2)が独自のシステムコールとして追加されましたが、rm(1)rmdir(1)の関係は残っています。

個人的にはrmdir junkの方が少し満足できると思いますが、最悪のことは空のディレクトリを削除することでした。

25
msw

それは歴史的です。 rmはファイルへの参照を削除するために作成され、rmdirmkdirと並行してディレクトリを削除するために作成されました。何年も前、Unix rmrmdirを呼び出すことによってのみディレクトリを削除できました。また、rmdir(2)システムコールはなく、rmdirunlink(2)を呼び出すプログラムでした。

参照:

7
Dee Hendrick

純粋に意見の問題ですが、rmはファイルを削除し、rmdirはディレクトリを削除します。ディレクトリはファイルですが、特別なタイプのファイルであるため、rmでそれらを削除することは意味がありますが、それらを特別に扱うこと(つまり、機能を有効にするために追加のオプションが必要になること)です。すべてのファイルがディレクトリであるとは限りません。rmdirがディレクトリではないものを削除するのは、私見では意味がありません。

2