「。」ディレクトリを削除できないのはなぜですか?

「。」ディレクトリを削除できないのはなぜですか?

「。」ディレクトリを削除してみました。親ディレクトリに移動せずに作業ディレクトリを削除できると思いました。

私の質問の焦点は、Linuxシステムでファイルを削除する方法についての洞察を見つけることです。

答え1

現在のディレクトリを削除しても、ファイルシステムまたはその論理構成の整合性には影響しません。削除から保護する.ことは、POSIX規格に準拠することです。rmdir(2)マニュアルページ:

path引数が参照するパスの最後のコンポーネントがドットまたはドットポイントの場合、rmdir()は失敗します。

その根拠は以下にあります。rmマニュアルページ:

誤って次の操作を実行した結果を回避するには、rmユーティリティでdotとdot-dotの名前を削除しないように無効にしてください。

rm -r .*

一方、現在のディレクトリを明示的に削除すること(つまり、フルパスまたは相対パスを宣言すること)は、SVR2より前のUnixバージョン7では禁止されているため、少なくともSVR3以降のUnixでは許可されています。これは、読み書き中のファイルを削除したときに発生する状況と非常によく似ています。削除されたファイルにアクセスするプロセスは、何も起こらなかったかのように読み取りと書き込みを続けます。プロセスの現在のディレクトリが削除されると、そのディレクトリはそのパスを介してアクセスできなくなりますが、プロセスが終了するか自分のディレクトリに変更されるまで、そのinodeはファイルシステムに残ります。

cd ..現在のディレクトリにエントリがなくなったため、プロセスは現在のディレクトリへの相対パスを使用してcwdを変更できません(たとえば)。..

誰かが を入力すると、rmdir .現在のディレクトリエントリを削除しようとしますが、ディレクトリがそのパスを使用して削除されると、3つのディレクトリエントリと.ディレクトリ..自体が実際に削除されます。

このディレクトリを削除せずにディレクトリエントリのみを削除すると、互換性のない.ディレクトリが作成されますが、前述のように標準ではこれを禁止します。

.@Emmanuelが正しく指摘したように、削除が許可されない2番目の理由があります。 1つ以上のPOSIX準拠のオペレーティングシステム(HFS +を含むMac OS X)は、厳しい制限の下で既存のディレクトリへのハードリンク作成をサポートします。この場合、ディレクトリ内でどのハードリンクが削除されると予想されるかを明確にする方法はありません。

答え2

現在そのディレクトリにあり、これは.単なる自己参照なので、完全性のために行われます。

親エントリに移動するか、そのrmdirパスを使用して呼び出す必要があります。次のことができます。

rmdir `pwd`

必要に応じてエイリアスを設定できます。たとえば、次のようになります。

alias rmc='rmdir `pwd`'

..rmc現在のディレクトリを削除するために個別に呼び出すことができます。

関連情報