私は毎日BSDとLinuxを使用していますが、rm(1)ではなくrmdir(1)を使用しなければならない状況は一度もありません。 rmdirの存在の目的は何ですか?
主な理由はおそらく歴史的です。昔は、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)
呼び出しを使用してディレクトリに_.
_および_..
_エントリを作成します。
「rm」はディレクトリでは機能しません。再帰的削除には、rmdirを使用するか、-rスイッチを指定する必要があります。その理由は歴史的です。unlink
とrmdir
は別々のシステムコールであり、Unixの初期のものです。
また、rmdirは空ディレクトリのみを削除します。ディレクトリ内の追加のファイルを削除しないようにする場合は、rmdir
の方がrm -r
よりも安全です(削除する内容を常に確認する必要があるようにrmにエイリアスを設定した場合を除く。つまり、〜/ .bashrcまたは使用しているもののalias rm='rm -i'
)。
また、rmdir
を使用すると、グロブ(ワイルドカード)式を使用して空のディレクトリを簡単に削除できます。たとえば、/tmp
内のすべての空のディレクトリを、内容のあるファイルやディレクトリに触れずに削除するには、次のようにします。
cd /tmp ; rmdir *