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


40

「。」を削除してみました ディレクトリ。親ディレクトリに移動することなく、作業ディレクトリを削除できると思った。

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


1
rm -r 'pwd'を試して、実際に親ディレクトリに移動せずに現在のディレクトリを削除します
faadi

7
この質問はその質問と重複しません。ハードリンクが合成されるのではなく、物理エンティティとして存在する理由を尋ねます。この質問は、なぜ機能しないのかだけでなく、なぜ機能rm .してrmdir .いないと指定されているのかを尋ねます。これは、ハードリンクの物理的な存在とは無関係です。
JdeBP

9
木に登って枝を切り取った画像。見始めたとき、カットのどちら側に座っていますか?(これは一言で言えばLinuxファイルシステムです。)
マイケル

7
rm -rf .*これだけで.なく..../..
、、

回答:


89

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

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

1つの根拠は、rmマニュアルページにあります。

rmユーティリティは、名前のドットとドットドットを削除することを禁止されています。

rm -r。*

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

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

誰かの種類がするとrmdir .、彼らはおそらく、現在のディレクトリエントリが削除されることを期待するが、ディレクトリが削除されたときに(そのパスを使用して)、3つのディレクトリエントリは、実際に、削除され...し、ディレクトリ自体を。

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

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


9
pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html "削除する親ディレクトリ内のファイル(ディレクトリ)の名前(特にプレゼンス)が明確ではないため、パス名/ dotを削除する意味は明確ではありません。ディレクトリへの複数のリンクの」
エマニュエル

@Emmanuel 3つ以上のリンクを持つ(つまり空ではない)ディレクトリを削除することは、既に設計上禁止されています(空でないディレクトリ)。リンクカウントが1のディレクトリは、標準では禁止されています(少なくとも、リンクカウントに意味があるファイルシステムの場合)。
-jlliagre

3
@jlliagre:それは、ディレクトリの問題ではありません含む複数のリンクを、しかし、ディレクトリが持つ複数のリンクを。一部のファイルシステムやオペレーティングシステムではこれが許可されていませんが、すべてではありません。
ヨルグWミットタグ

@JörgWMittag複数のディレクトリを含むディレクトリに、そのサブディレクトリがすべて..リンクしているため、設計上複数のリンクがあります。これは、link count > 2圧倒的多数のOSおよびファイルシステムのユニークなケースであるため、「一部のファイルシステムおよび/またはオペレーティングシステム」は控えめな表現です。歴史的でない唯一の既知の例外は、HFS +を搭載したMac OS Xです。これにより、誰と何ができるかについての制限が追加されます。POSIXコメントがこの奇妙なことに向けられていることを認めた。unix.stackexchange.com/questions/22394/を
jlliagre

ねえ、私はrm -r .*以前にやったことがあり、親ディレクトリの下のすべてを再帰的に吹き飛ばしました...それは10年または2年以上前rmでしたが、これを許可しないことを知ってうれしいです。
antak

9

あなたは現在そのディレクトリ内にいて.、自己参照のみであるため、整合性のためにそのように行われます。

その親に入るかrmdir、そのパスで呼び出す必要があります。

rmdir `pwd`

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

alias rmc='rmdir `pwd`'

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


13
しかし、仮想rmdir .コマンドがファイルシステムの整合性を損なうか、rmdir $(pwd)または損なう理由と方法はrmdir "$PWD"
G-Manが「Reinstate Monica」と言う

4
FSの整合性の問題ではなく、論理的な組織の問題です。現在のディレクトリを選択したら、シェルに今後の操作にこのディレクトリを使用するように指示しますが、それ自体から何かを削除することはできません。
ジュリーペレティエ

7
私はそれが推測に見えるのではないかと思います。
エマニュエル

4
@FranklinPiatあなたのコメントは特に役に立ちませんでした:1. OPはをどこで使用rm *しましたか、またシェルの履歴はどういう意味ですか?2.答えは、なぜかという部分に対処しました。
JBentley

4
@ G-Manを実行するとrmdir $(pwd)pwdたとえば/foo/bar/baz、現在のディレクトリの論理名がrmdirわかり、そのパスが表示されると、条件が満たされていればディレクトリbazからエントリが削除/foo/barされます。意味あり。rmdir .一方、コマンドは.、現在のディレクトリからエントリを削除するための命令であり、許可されていない(すべてのディレクトリが.それ自体を指すエントリを持っているという制約に違反する)こともなければ(リンクを削除しない)あなたは望んでいた)を除去しました。
ホッブズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.