web-dev-qa-db-ja.com

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

「。」を削除してみましたディレクトリ。親ディレクトリに移動しなくても、自分の作業ディレクトリを削除できると思いました。

私の質問の要点は、Linuxシステムがファイルを削除するためにどのように機能するかについての洞察を探すことです。

41
Goldname

現在のディレクトリを削除しても、ファイルシステムの整合性やその論理構成には影響しません。 rmdir(2) マニュアルページに記載されているPOSIX標準に従うために、.の削除を防止します。

Path引数が最終コンポーネントがドットまたはドット-ドットのいずれかであるパスを参照している場合、rmdir()は失敗します。

rm マニュアルページに1つの根拠があります:

Rmユーティリティは、誤って次のようなことを行うことによる影響を回避するために、ドットとドットドットの名前を削除することは禁止されています。

rm -r。*

一方、現在のディレクトリを明示的に削除すること(つまり、フルパスまたは相対パスを指定すること)は、UNIXでは許可された操作です。少なくとも、SVR3はSVR2まではUnixバージョン7で禁止されていたためです。これは、アクティブに読み取りまたは書き込みが行われているファイルを削除したときに発生する状況とよく似ています。削除ファイルにアクセスするプロセスは、何も起こらなかったかのように、読み取りおよび書き込み操作を続行します。プロセスの現在のディレクトリを削除すると、このディレクトリはパスを介してアクセスできなくなりますが、プロセスが停止するか、独自のディレクトリを変更するまで、そのiノードはファイルシステムに存在し続けます。

現在のディレクトリにはcd ..エントリがないため、プロセスは現在のディレクトリからの相対パスを使用してcwdを変更できないことに注意してください(例:..)。

誰かがrmdir .と入力すると、現在のディレクトリエントリが削除されることを期待している可能性がありますが、(パスを使用して)ディレクトリが削除されると、実際に3つのディレクトリエントリ...とディレクトリ自体。

このディレクトリのディレクトリエントリではなく.のみを削除すると、非準拠のディレクトリが作成されますが、すでに述べたように、標準では禁止されています。

@Emmanuelが正しく指摘したように、.の削除が許可されない2つ目の理由があります。強力な制限付きで、既存のディレクトリへのハードリンクの作成をサポートするPOSIX準拠のOS(HFS +を搭載したMac OS X)が少なくとも1つあります。そのような場合、ディレクトリ内から、どのハードリンクが削除されることが予想されるものであるかを知る明確な方法はありません。

90
jlliagre

あなたは現在そのディレクトリと.は単なる自己参照です。

親に移動するか、パスを指定してrmdirを呼び出す必要があります。これは次のように実行できます。

rmdir `pwd`

頻繁に必要な場合は、次のようにエイリアスを設定できます。

alias rmc='rmdir `pwd`'

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

9
Julie Pelletier