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

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

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

答え1

主な理由はおそらく歴史的なものです。昔々、システム コールは存在せずrmdir(2)(mkdir(2)ここでは 7th Edition UNIX™ について説明しています)、ディレクトリを削除するにはrmdir(1)(必然的に) SUID ルート プログラムがシステム コールを使用していましたunlink(2)

第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巻の記事については、フリーBSD第 1 巻のコマンドとシステム コールのサイト。

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

ディレクトリを削除するにはrm、オプションを指定する必要があります-r

対称性に関する議論もあります。mkdir(1)ディレクトリを作成するにはコマンドが必要です。実行したrmdir(1)操作を元に戻すコマンドがあるのは当然のことmkdir(1)です。さらに、これらは (最近では)rmdir(2)およびmkdir(2)システム コールの単純な実行者です。そうです、7th Edition UNIX では、mkdir(1)も SUID ルート プログラムであり、mknod(2)呼び出しを使用してディレクトリ ノードを作成し、 呼び出しを使用してディレクトリにおよびエントリlink(2)を作成していました。...

答え2

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

答え3

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

答え4

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

cd /tmp ; rmdir *

関連情報