
私はPythonを使用してUnixインストールボリュームからファイルを検索し、そのファイルの存在に基づいてデータベースからファイル名を追加または消去します。スキャンしているボリュームが何らかの理由でアンマウントされた場合、スキャンはそのボリュームのすべてのファイル名を消去する必要があると仮定することに気づきました。こんな。ボリュームをマウントするより良い方法や提案がありますか?
私が考えることができる唯一の方法は、スキャンする前にスキャンされた各ボリュームに永続ダミーファイルを配置して、ダミーファイルが見つかった場合にのみボリュームをスキャンすることです。
答え1
これを使用して、特定のディレクトリがmountpoint
マウントポイントであることを確認できます。はい
mountpoint /mnt/foo; printf "$?\n"
/dev/foo is a mountpoint
0
mountpoint /mnt/bar; printf "$?\n"
/dev/bar is not a mountpoint
1
戻り値が示すように、これはif
スクリプト文内で簡単に使用できます。
答え2
st_dev
古典的な答えは、フィールドが返された場合にディレクトリがマウントポイントであることです。stat
親ディレクトリまたはルートディレクトリの値とは異なります。これはほとんどのツール(、、、、find -xdev
… )で使用される標準です。これは次のとおりです。rsync -x
du -x
os.path.ismount
Pythonの関数。
このアプローチは、ファイルシステムが配列されるいくつかの複雑な方法のために、偽の肯定と偽の否定の両方を引き起こす。たとえば、Linuxでは次のことができます。バインドマウント(の一部)サブディレクトリにあるファイルシステム、親ディレクトリが同じファイルシステムにあるマウントポイントを作成します。逆に、サブボリューム(少なくともbtrfs)を持つ一部のファイルシステムはst_dev
各サブボリュームに異なる値を提供しますが、サブボリュームのルートはマウントポイントではありません。ネットワークファイルシステムは、クライアントが同じサーバーディレクトリを別のパスにマウントでき、可能であれば別のエクスポートを介してマウントできるため、誤検知と誤検知が発生する可能性があります。
ディレクトリが空であっても別のときにマウントポイントという意味ではないので、これは直接的な助けにはなりません。マウントポイントを検出するには、インデックス時にこれを行う必要があります。別のインデックスに別々のマウントポイントを維持し、ルートが存在し、空でないインデックスのみを更新できます。共通ファイルシステムがマウントされていない場合でも、他のファイルシステムがマウントされているか、単にディレクトリにファイルがあるため、マウントポイントであるディレクトリが空にならない可能性があります(ディレクトリ内のファイルは隠されています)、そのディレクトリはマウントポイントです。