web-dev-qa-db-ja.com

rmdir(1)とrm(1)が共存する理由は何ですか?

私は毎日BSDとLinuxを使用していますが、rm(1)ではなくrmdir(1)を使用しなければならない状況は一度もありません。 rmdirの存在の目的は何ですか?

17
Howard

主な理由はおそらく歴史的です。昔は、rmdir(2)mkdir(2)のシステムコールはなく(ここでは第7版UNIX™について説明しています)、rmdir(1)は(必要に応じて)unlink(2)システムコールを使用してディレクトリを削除したSUIDルートプログラム。

第7版UNIXマニュアルは、オンラインで入手できます http://cm.bell-labs.com/7thEdMan (最終チェック日:2017-04-23);それらは http://plan9.bell-labs.com/7thEdMan (最終チェック済み2017-04-23)でも入手できます。また、オンラインには少なくとも1つの代替ソースがあるようです— http://wolfram.schneider.org/bsd/7thEdManVol2/ —第2巻の記事については、 FreeBSD 第1巻のコマンドとシステムコールのサイト。

rmコマンド(通常の非SUIDプログラム)は、rmdir(1)コマンドを呼び出して空のディレクトリを削除しました。それ自体はそうすることができませんでした。それにはroot権限が必要でした。したがって、rmdir(1)コマンド(Unix V7のソースコードについては ここ を参照)は空のディレクトリを削除するために存在し、rmコマンドは空のディレクトリ自体を削除しませんでした。

rmを使用してディレクトリを削除するには、_-r_オプションを指定する必要があります。

対称性の議論もあります。ディレクトリを作成するには、コマンドmkdir(1)が必要です。 rmdir(1)が行ったことを元に戻すコマンドmkdir(1)を使用するのは合理的と思われます。さらに、それらは(最近)rmdir(2)およびmkdir(2)システムコールの単純なエクササイザーです—はい、第7版UNIXでは、mkdir(1)もSUIDルートでしたプログラムでは、mknod(2)呼び出しを使用してディレクトリノードを作成し、link(2)呼び出しを使用してディレクトリに_._および_.._エントリを作成します。

27

「rm」はディレクトリでは機能しません。再帰的削除には、rmdirを使用するか、-rスイッチを指定する必要があります。その理由は歴史的です。unlinkrmdirは別々のシステムコールであり、Unixの初期のものです。

6
Andy Ross

また、rmdirはディレクトリのみを削除します。ディレクトリ内の追加のファイルを削除しないようにする場合は、rmdirの方がrm -rよりも安全です(削除する内容を常に確認する必要があるようにrmにエイリアスを設定した場合を除く。つまり、〜/ .bashrcまたは使用しているもののalias rm='rm -i')。

3

また、rmdirを使用すると、グロブ(ワイルドカード)式を使用して空のディレクトリを簡単に削除できます。たとえば、/tmp内のすべての空のディレクトリを、内容のあるファイルやディレクトリに触れずに削除するには、次のようにします。

cd /tmp ; rmdir *
1
Pat