フォルダ用に作成された特別なハードリンク「。」のリンクを解除(削除)するにはどうすればよいですか?


29

Linuxでは、フォルダを作成すると、対応するiノードへの2つのハードリンクが自動的に作成されます。1つは作成を要求したフォルダーで、もう1つは.このフォルダーの特別なフォルダーです。

例:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

あなたが見ることができるように、両方folder.の内部には、folder(で示したものと同じinode番号持つ-iオプション)。

この特別な.ハードリンクを削除する方法はありますか?

それは実験と好奇心のためだけです。 また、答えは..特別なファイルにも当てはまると思います。

私はrm人間を調べようとしましたが、それを行う方法が見つかりませんでした。.私が得るすべてを削除しようとすると:

rm: "。" 「..」は削除できません

私はこれらの事柄がどのように機能するかについて本当に興味がありますので、このテーマについて非常に冗長になることを控えないでください。

編集:たぶん、私は自分の投稿で明確ではなかったかもしれませんが、.ファイルの原因である基本的なメカニズムと、ファイルを削除できない理由を理解したいと思います。

POSIX標準では、ハードリンクが2つ未満のフォルダーは許可されませんが、実際には理由がわかりません。とにかくそれができるかどうか知りたいです。



@StephenKitt編集をご覧ください。
幻想

1
私は...の投票が出果たしている方法を見てみましょう、私の投票を引っ込めてきました
スティーブン・キット

2
両方とも相対パスに必要です。なぜこれらを削除したいのですか(単なる好奇心以外)。
HalosGhost

@HalosGhost私は非常に好奇心ha盛で、システムの限界と、このように設計された方法と理由を調査しています。
幻想

回答:


46

.少なくともEXT4ファイルシステムでは、技術的に削除できます。でファイルシステムイメージを作成しtest.img、マウントしてtestフォルダーを作成し、再度アンマウントする場合は、次を使用して編集できますdebugfs

debugfs -w test.img
cd test
unlink .

debugfs文句を言わず.、ファイルシステムのディレクトリエントリを忠実に削除します。testディレクトリには、1つの驚きで、まだ使用可能です。

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

ショーのみ

..

これ.は本当になくなっています。しかしcd .ls .pwdまだいつものように振る舞います!

以前はこのテストをを使用して実行rmdir .していましたが、ディレクトリのiノードが削除され(これ指摘してくれたBowlOfRedに多大感謝を送ります)、ぶら下がるディレクトリエントリが残り、問題が発生する本当の理由です。このシナリオでは、フォルダーは使用できなくなります。イメージをマウントした後、実行するとtesttestls

ls: cannot access '/mnt/test': Structure needs cleaning

カーネルログは

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

e2fsckこの状況でイメージを実行すると、testディレクトリが完全に削除されます(ディレクトリiノードがなくなったため、復元するものは何もありません)。

これはすべて.、EXT4ファイルシステムに特定のエンティティとして存在することを示しています。カーネル内のファイルシステムのコードから、それが存在することを期待...、存在しない場合は警告するという印象を受けましたが(を参照namei.c)、unlink .ベースのテストではその警告は表示されませんでした。e2fsck欠落している.ディレクトリエントリが気に入らないため、修正を提案します。

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

これにより、.ディレクトリエントリが再作成されます。


とても興味深い!ありがとうございました!そのため、.フォルダはFS内に実際に存在し、ツールはそれが適切に動作することを期待しています。
幻想

本当に嬉しいです。LinuxとそのFSについては、この種の情報を見つけるのに十分な知識がないので、時間をかけて答えてくれてとても感謝しています:)
Fantattitude

3
「rmdir」(実際にiノードを削除する)を「unlink」(ディレクトリエントリのみを削除する)に変更してみてください。ほとんど機能しているディレクトリ(mountまたは上のエラーなしls)を残すようです。他の問題が発生するかどうかはわかりません。
BowlOfRed

@BowlOfRedに感謝します。これは非常に良い点です。つまり、私rmdir .は実際にそれを破壊testし、ぶら下がりディレクトリエントリとして残しました。unlink私の回答を確認して更新します!
スティーブンキット

1
@GiacomoCatenazziは直接ではなく、アクセス許可と所有権はディレクトリエントリではなくiノードに保存されます。
スティーブンキット

5

このディレクトリエントリを削除する方法はありません。.エントリー手段「このディレクトリ」、..エントリ手段「は、このディレクトリの親ディレクトリ」。これらは実際にはハードリンクではなく、ディレクトリ構造が作成/表示される方法です。


私はそれについて知っています、それらがハードリンクであるように見えるので、それが可能かどうかだけに興味があります。そうでない場合は、iノードのハードリンクカウントに加算されますか?
幻想

3
>それらは実際にはハードリンクではなく、ディレクトリ構造が作成/表示される方法です。また、複製します。unix.stackexchange.com/questions/289385/...
Xalorous

@Xalorousそれでは、これらの特別なファイルを正確に表すものは何ですか、もしそれらがハードリンクでなければ、それらは何ですか?それらは存在するので、どこかにあるに違いありません。ただし、それらが単に表示されるlsか、他のツールが自動的に表示される場合は例外です。
幻想

@Fantattitudeは、rmdirがPWDを削除できないというPOSIX要件を実装するために、フォルダーがそれ自体を表す方法です。
-Xalorous

1
従来のUnixファイルシステムでは、それらは実際のハードリンクです。それらは、他のファイルシステムのドライバーによってオンザフライで合成されます。
バーマー

2

LionのUnix 6ソースコードに関する注意事項に記載されているとおり初期のUnixには、ファイルとディレクトリの両方がiノード構造によってディスク上に表されるディスクファイルがありました。ファイルの内容がディレクトリであることを示す特別なビットがありました。各iノードには、所有するiノードへのリンクがあり、ファイルがどのディレクトリにあるかを知ることができました。例外は、自身を所有する「/」ディレクトリでした。コンテンツへのリンクもありました。iノードにコンテンツがない場合は、空きリストに戻すことができます。ディレクトリは単なる祝福されたファイルであるため、ガベージコレクションされないようにするには、空のディレクトリにも内容が必要でした。したがって、..は親iノードへのiノードのリンクであり、。ディレクトリがまだ使用可能であることを示すためにありました。rmdirは(unlinkを呼び出すことにより)を削除できます。


0

ポスト「の可能重複」の答えは、現在のディレクトリを削除するには、rmdir試みた場合、それは失敗するものとし、POSIX標準の指定を言います。

構築するものは何であれ、基盤が必要です。「ここ」と言う方法なしに相対パスを定義することは困難です。そのため、「。」ここで定義されています。

また、「ドット」と「ドットドット」を削除できます。それらを定義しない独自のOSを作成します。Unix(および拡張機能としてMac OSX)、Linux、さらにMS DOSとWindowsでもすべてドットとドットドットを使用しています。

TL; DR-「ドット」はOSの定義にあります。


この回答は、主にTL; DRに適しています。
ジョシュア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.