🖥️

ファイルやディレクトリの実体の確認方法としての inode 番号

2021/09/23に公開

ファイルやディレクトリの実体の確認方法としての inode 番号

Linux の場合、何らかのアプリケーションがファイルやディレクトリを開いていると、ファイルシステム上でファイルやディレクトリを削除しても実際には削除されません。

今開いているファイルまたはディレクトリとファイルシステムとしして見えているものが同じであるか inode 番号により確認できます。

以下のように ls に -i を指定して確認するか

ls -li

あるいは、以下のように stat -c %i でファイル/ディレクトリを指定して確認できます。

stat -c %i ファイル名

例えば tmp のディレクトリの中に test というディレクトリがあるとします。

$ find tmp
tmp
tmp/test

tmp/test の inode 番号を確認します。

$ stat -c %i tmp/test/
80488076

それで上記コマンドを実行したのと、別のシェルを起動して、tmp/test に移動してからカレントディレクトリに対して、stat -c %i を実行すると、 inode 番号は同一と確認できます。

~  $ cd tmp/test/
~/tmp/test  $ stat -c %i .
80488076

その状態で最初のシェルで tmp/test を削除してから、再度作成して inode 番号を確認すると、inode 番号が変わっているのを確認できます。

$ rmdir tmp/test
$ mkdir tmp/test
$ stat -c %i tmp/test/
80484300

それで、 tmp/test に移動したほうのシェルに戻って stat -c %i を実行しても inode 番号が変わっていないのを確認できます。

~/tmp/test  $ stat -c %i .
80488076

そのうえで、いったん親ディレクトリに移動したうえで、test ディレクトリに移動して stat -c %i を実行すると新しく作成した test ディレクトリの inode 番号になっていることが確認できます。

~/tmp/test  $ cd ..
~/tmp  $ cd test/
~/tmp/test  $ stat -c %i .
80484300

別のシェルで test ディレクトリにいたために、シェルが開いていたためにファイルシステム上では削除されたディレクトリを参照し続けていたことがわかります。

Discussion