私は毎日 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 スイッチを指定する必要があります。その理由は歴史的なもので、unlink
とrmdir
は別々のシステム コールであり、Unix の初期の頃から存在していました。
答え3
またrmdirは削除のみを行います空のディレクトリ。ディレクトリ内の追加ファイルを削除しないようにしたい場合は、rmdir
よりも安全ですrm -r
(ただし、rm にエイリアスを設定して、削除する内容を常に確認する必要がある場合、つまりalias rm='rm -i'
~/.bashrc などで使用している場合を除きます)。
答え4
また、グロブ (ワイルドカード) 式を使用して空のディレクトリを簡単に削除できます。たとえば、コンテンツのあるファイルやディレクトリを変更せずにrmdir
、すべての空のディレクトリを削除するには、次のようにします。/tmp
cd /tmp ; rmdir *