「。」を削除してみました ディレクトリ。親ディレクトリに移動することなく、作業ディレクトリを削除できると思った。
私の質問のポイントは、Linuxシステムがどのようにファイルを削除するかについての洞察を探すことです。
rm .
してrmdir .
いないと指定されているのかを尋ねます。これは、ハードリンクの物理的な存在とは無関係です。
rm -rf .*
これだけで.
なく..
../..
「。」を削除してみました ディレクトリ。親ディレクトリに移動することなく、作業ディレクトリを削除できると思った。
私の質問のポイントは、Linuxシステムがどのようにファイルを削除するかについての洞察を探すことです。
rm .
してrmdir .
いないと指定されているのかを尋ねます。これは、ハードリンクの物理的な存在とは無関係です。
rm -rf .*
これだけで.
なく..
../..
回答:
現在のディレクトリを削除しても、ファイルシステムの整合性やその論理的な編成には影響しません。.
削除の防止は、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)があり、強力な制限により、既存のディレクトリへのハードリンクの作成をサポートしています。そのような場合、どのハードリンクが削除されると予想されるかをディレクトリ内から明確に知る方法はありません。
..
リンクしているため、設計上複数のリンクがあります。これは、link count > 2
圧倒的多数のOSおよびファイルシステムのユニークなケースであるため、「一部のファイルシステムおよび/またはオペレーティングシステム」は控えめな表現です。歴史的でない唯一の既知の例外は、HFS +を搭載したMac OS Xです。これにより、誰と何ができるかについての制限が追加されます。POSIXコメントがこの奇妙なことに向けられていることを認めた。unix.stackexchange.com/questions/22394/を
rm -r .*
以前にやったことがあり、親ディレクトリの下のすべてを再帰的に吹き飛ばしました...それは10年または2年以上前rm
でしたが、これを許可しないことを知ってうれしいです。
あなたは現在そのディレクトリ内にいて.
、自己参照のみであるため、整合性のためにそのように行われます。
その親に入るかrmdir
、そのパスで呼び出す必要があります。
rmdir `pwd`
頻繁に必要な場合は、次のようにエイリアスを設定できます。
alias rmc='rmdir `pwd`'
.. rmc
現在のディレクトリを削除するために単独で呼び出すことができます。
rmdir .
コマンドがファイルシステムの整合性を損なうか、rmdir $(pwd)
または損なう理由と方法はrmdir "$PWD"
?
rm *
しましたか、またシェルの履歴はどういう意味ですか?2.答えは、なぜかという部分に対処しました。
rmdir $(pwd)
、pwd
たとえば/foo/bar/baz
、現在のディレクトリの論理名がrmdir
わかり、そのパスが表示されると、条件が満たされていればディレクトリbaz
からエントリが削除/foo/bar
されます。意味あり。rmdir .
一方、コマンドは.
、現在のディレクトリからエントリを削除するための命令であり、許可されていない(すべてのディレクトリが.
それ自体を指すエントリを持っているという制約に違反する)こともなければ(リンクを削除しない)あなたは望んでいた)を除去しました。