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


17

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


2
OT、しかしFWIW、これは面白い(そして異なる)使用法を示しています:cyberciti.biz/faq/linux-unix-remove-directory
pst

回答:


27

主な理由はおそらく歴史的なものです。戻る昔、昔、何もなかったrmdir(2)し、mkdir(2)システムコールは、(私たちがここ™第7版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)でも入手できます。また、Volume 2の記事には少なくとも1つのオンラインソース(http://wolfram.schneider.org/bsd/7thEdManVol2/)があり、Volume 1のコマンドとシステムコールのFreeBSDサイトへのリンクがあるようです。

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

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

対称性の議論もあります。mkdir(1)ディレクトリを作成するにはコマンドが必要です。行った操作rmdir(1)を取り消すコマンドを使用するのが妥当と思われますmkdir(1)。加えて、彼らはの(これらの日)シンプルexercisorsあるrmdir(2)mkdir(2)はい、バック第7版UNIXで、 -システムコールのmkdir(1)使用、また、SUID rootプログラムしたmknod(2)ディレクトリノードと作成するために、コールをlink(2)作成するための呼び出しを.して..、ディレクトリ内のエントリを。


ああ!これはすべて理にかなっている、素晴らしい!

2
いいね 私はここにある3BSDのコピーをチェックしましたが、rmdirシステムコールのドキュメントもありません。また、rmdir(1)はunlinkを使用して実装されています。
アンディロス

4
mknod +リンクおよびリンク解除システムの主な欠点の1つは、ディレクトリの作成がアトミック操作ではないため、部分的に完全なディレクトリになる可能性があることです。発生した不整合についてファイルシステムをチェックするために考案されたプログラムが多数ありました。fsck(1)生き残ったものです。
ジョナサンレフラー

@ Jonathan、Xenixの思い出を持ち帰りました。うん!はい、本当に悪いことが起こる可能性があります。
Fiasco Labs

6

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


4
幸せな副作用は、ファイルのみを削除する場合に、誤ってディレクトリを削除する可能性がわずかに低くなることです。

ありがとうございました。「rm -r」と「rmdir」のキーストロークの量が同じであることに気付きました。rmdirは純粋に歴史的な理由で存在しますか(..数十年前のUnixプログラムと互換性がありますか)?

2
実際、Unixの初期の頃には、システムコールとしてrmdir(2)mkdir(2)存在していませんでした。ユーザーrootmknod(2)呼び出しを使用してディレクトリノードを作成し、呼び出しを使用してディレクトリ内のエントリとエントリlink(2)を作成できます。そして、使用できるディレクトリエントリを削除するための呼び出しを。...rootunlink(2)
ジョナサンレフラー

3

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


1

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

cd /tmp ; rmdir *

の使用を検討してくださいrmdir /tmp/*/tmpディレクトリが本当に大きい場合、名前ごとに余分な5文字があるため、引数のスペースが少し速くなる可能性がありcdますが、ディレクトリ階層内を移動する必要はありません。また、rmdir /tmp/* 2>/dev/nullエラーメッセージが表示されないようにすることも検討する価値があります(通常、多くのエラーメッセージが表示されますが、ほとんどすべてのエラーメッセージはそのタスクとは無関係です)。
ジョナサンレフラー14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.