なぜ `cp`と` rm`はディレクトリを別々に扱うのですか?


10

ツールがディレクトリを好きでcprm通常のファイルとは別に扱うのはなぜですか?どちらも、ユーザーが再帰的な動作を希望することを明示的に指定する必要があります。そうしないと、ディレクトリをまったく扱いません。

コンピュータとの最初のやり取り(しばらくの間)は、Windows / GUI /ポイントアンドクリック/ドラッグアンドドロップ環境で行われましたが、これらの操作がターゲットに関係なく同じように動作するのは常に自然なことでした。

この動作は、ワイルドカードを使用してコマンドを実行するときに特にイライラします。空でないサブディレクトリ*を除いて、ディレクトリ()内のすべてを削除したい場合はどうなりますか?

これは、ユーザーが自分で足を撃たないようにするための一種のセキュリティ機能であるとしか想像できませんが、これはいくつかのUnixの原則についての私の理解と矛盾しています。

  • Unixは通常、ユーザーを自分から保護しません。それは常にユーザーが彼女がしていることを知っていると仮定しています。
  • Unixの場合、すべてがファイルです。ディレクトリは単なる別のファイルではありませんか?なぜ違う扱いを受けるのですか?

私の質問:

  • この動作は技術的な制限によるものですか、それとも意図的な選択ですか?

後者の場合、

  • この選択の動機となった理由の歴史的な説明はありますか?

以下のためにrmあなたはそれがファイルとディレクトリの違いを無視したい場合は、少なくとも、あなたはあなたの中に置くことができる~/.bashrcファイル:alias rm='rm -r'
BenjiWiebe 2013年

1
また、異なるが関連の質問を参照してくださいunix.stackexchange.com/questions/46066/...
derobert

1
cpとrmをWindowsファイルマネージャーと比較することはできません。cmd.exeを起動し、コピーして削除して、動作を比較します。
ott-- 2013年

回答:


11

Derobertのなぜunix mvプログラムはディレクトリに-R(再帰)オプションを必要としないが、cpはそれを必要とするのか?基本的にあなたの質問に答えます:通常のファイルをコピーまたは削除することは、ディレクトリに対して同じ操作を行うこととは異なります。ディレクトリの場合、そこに含まれるすべてのファイルを処理する必要があるためです。したがって、操作は基本的に異なります。

またrmdir、空のディレクトリでのみ機能する特別なユーティリティがあることにも注意してください。事実を確認しないと、これはおそらく元々rmはディレクトリ以外を削除することしかできず、深い削除はrm空のディレクトリを再帰的に使用して削除する必要があったことを結論付けrmdirます。


rmdirまた、ディレクトリの削除に使用されたシステムコールの名前でもあります。システムコール用のディレクトリは空である必要があり、同じ名前のユーティリティは、unlinkコマンドとユーティリティに似た、単なる「フロントエンド」です。
ヨルダン2013年

まさに-それが原因で、元々rmディレクトリをまったく削除できなかった可能性があると私が信じるようになりました(コマンドラインユーティリティは、多くの場合、syscallsの比較的単純なラッパーであるためです)。
peterph 2013年

私の質問のタイトルは、私が技術的な詳細について尋ねていると誤解するかもしれません。それが意図的な選択であるかどうか私は尋ねていました。エンドユーザーの観点からは、この動作は一貫性がないと私が考えるのは私だけだと思います。私の質問に間接的に答えているので、私はあなたの答えを受け入れます:Unixの内部(syscallレベル)の技術的な制限がこの動作の起源であるように思われ、レガシーはおそらく今日私たちが他の方法でそれを行うことを妨げます。「syscallの単純なラッパー」は、よりインテリジェントな動作を提供するはずではありませんか?
rahmu 2013年

2
エンドユーザーの視点から見ると、確かに奇妙に思えますが、実際に理由を尋ねていました。:)ラッパーに関しては-それはすべて、それらがどれほど「単純」であるかに依存します(そして、あなたがまだ「単純」と呼びたいものに依存します)。Modern rmは、単純なラッパーではありません(mroeファイルとディレクトリを一度に削除できます)。オプションを指定したくない場合-rは、シェルのエイリアス機能を使用するか、それを配置する独自のラッパーを作成します(低速ですが、使用しているシェルとは無関係です)。
peterph 2013年

2

一部のUNIXフレーバーでは、rmのマニュアルページで、ファイルのリンクを解除するコマンドとして指定されています。
UNIXでは、ファイルはInodesと呼ばれるファイルシステム内のオブジェクトであり、ファイルシステム内のID以外の名前や場所はありません。それらの名前は、さまざまなディレクトリ内のそれらへの参照です。これは、リストされているファイル(またはファイルなのでディレクトリ)にインデックスを付けるファイルの一種です。
ファイルのリンクを解除すると、ファイルの参照カウントは減少し、0に達すると、ファイルシステムによって空きとしてマークされ、そのブロック/エクステントも空きとしてマークされるため、実際には削除されます。

最初にその中のファイルのリンクを解除せずにディレクトリをrmする機能があった場合、ファイルシステムで参照されているiノードがあるが、通常の方法ではアクセスできないポイントに到達します。
参照カウントに従ってそれらへの参照があるため、削除済みとしてマークされず、失われたファイルになります。
失われた「ファイル」がディレクトリの場合、これはさらに複雑になるため、ファイルシステムで失われる可能性のあるストレージの量が増加します。

rm -rは、標準の「UNIXスピリット」を犠牲にしてUNIXユーザーの生活を楽にする機能として追加されました。これは、ディレクトリに降りてファイルを削除するため、従来のUNIXユーティリティよりも複雑であるためです。

さらに、UNIXの初期の段階では、システムに十分なメモリがなかったため、ディレクトリの再帰構造をマッピングするとパフォーマンスが低下し、作業を分割せずに実行できない場合がありました。

cp、ファイルを読み取り、ブロックごとにコピーします。ファイルと同じようにディレクトリをコピーすると、参照カウントを増やすことなくファイルへの参照が追加され、データの一貫性が失われる可能性があります(ブロックの空き領域としてマークされているブロックのiノードへの読み取り/書き込みを行うと、元のiノードが削除された)、データが失われる-ファイルへの最後の(既知の)参照を削除すると、そのiノード番号がリサイクルされる可能性があるため。

tl; dr群衆の場合:
UNIXのディレクトリは一種のファイルですが、それは事実ですが、ディレクトリ内の情報はファイルシステムのメタデータであるため、システムによって異なる方法で処理されるため、ファイルを操作するコマンドは、依存メタデータを操作するための動作の変更。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.