web-dev-qa-db-ja.com

なぜrmは空のフォルダに-rが必要なのですか?

いつも私を悩ませた一つのこと:

touch a
rm a

はい、期待どおりに動作します

mkdir a
rm a

動作するには-rが必要です。しかし、これで何が再帰的か分かりませんか?フォルダが空の場合、再帰的なものはありません。私はrm aがaを削除しようと試み、それが空でなければ失敗し、rm -rがaの内容を再帰的に期待します。

どうしてこんな感じなの?

編集:この質問は完全に無関係な質問の複製としてフラグが付けられています。私の質問は次のように要約することができます:非再帰的な操作を実行するために再帰的なフラグが必要なのはなぜですか:mkdir a、rm -r aはそれについて再帰的ではありません。そして、これはrmがデフォルトで再帰的でない理由についての他の質問とは関係ありません。

2
Thomas

これは、rmがディレクトリを削除するためのものではなかったためです。

元々rm-rをサポートしておらず、ユーザーには1つのオプションしかありませんでした:rmを使用してディレクトリ内のすべてのファイルを削除し、その後rmdirを使用して(現在は空の)ディレクトリを削除します

明らかにこのように機能するのはvery迷惑なので、この問題を修正するために-rが実装されました。

ただし、rm /some/empty/dirが機能し始める場合は、下位互換性がなくなるため、rm /some/empty/dirが失敗すると想定していた古いコードが壊れる可能性があります。 -rでは、この動作はまだ定義されていないため、これは問題ではありません(-rオプションがまだ存在していないため)

6
Garo

man rmから:

デフォルトでは、rmはディレクトリを削除しません。 --recursive(-rまたは-R)オプションを使用して、リストされている各ディレクトリも、そのすべてのコンテンツとともに削除します。

ここで推測してみましょう。これは、気づかないうちにファイルが含まれているディレクトリを削除しないという安全機能です。 (rmとは対照的に)rmdirは、ディレクトリが最初にコンテンツを持っているかどうかをチェックしないと思います。


編集:ファイルを再帰的に削除しないと、名前とiノードがディレクトリに保存されているため、ファイルを見つけるのに問題があると思います。ディレクトリを削除すると、inodeはあるがファイル名はない「ゾンビ」ファイルが作成されます。 EXT構造 に関するこの投稿と比較してください。

3
Fiximan