ディレクトリ内のすべてを削除するコマンドがrm -rf
。
rmdir
で同じことをするフラグがないのはなぜですか?
ディレクトリ操作にrmdir
を使用する方が直感的ではないでしょうか?
初期の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
の方が少し満足できると思いますが、最悪のことは空のディレクトリを削除することでした。
それは歴史的です。 rm
はファイルへの参照を削除するために作成され、rmdir
はmkdir
と並行してディレクトリを削除するために作成されました。何年も前、Unix rm
はrmdir
を呼び出すことによってのみディレクトリを削除できました。また、rmdir(2)
システムコールはなく、rmdir
はunlink(2)
を呼び出すプログラムでした。
参照:
純粋に意見の問題ですが、rm
はファイルを削除し、rmdir
はディレクトリを削除します。ディレクトリはファイルですが、特別なタイプのファイルであるため、rm
でそれらを削除することは意味がありますが、それらを特別に扱うこと(つまり、機能を有効にするために追加のオプションが必要になること)です。すべてのファイルがディレクトリであるとは限りません。rmdir
がディレクトリではないものを削除するのは、私見では意味がありません。