a_1からa_nまでのn個のファイルが互いにハードリンクされているとします。さらに、b_1からb_mまでm個のファイルがありますが、互いにハードリンクされています(ただし、a_*ファイルにはハードリンクされません)。
b_*ハードリンクをa_*ファイルとして指定する最も賢い方法は何ですか? b_1を繰り返して、それぞれをa_1として指定しますか?それともグループ全体をまとめる方法はありますか?
bファイルのいずれかを知っている場合は、どのようにb_*ファイルを検索できますか?つまり、特定のファイルにハードリンクされている他のすべてのファイルを見つける方法は何ですか?ファイル全体をスキャンするのではなく、Pythonを使用する方が良いですか?
答え1
いいえ、一緒に変更することはできません。その理由は、関連する建設にあります。議論を容易にするために、文書は3つの部分に分かれています。
- ファイル名
- インデックスノード
- ファイルデータ
ポインタが実行される場所file names --> inode --> file data
。 inodeからファイル名を取得するバックポインタはありません。
inodeを指すファイル名を見つける唯一の方法は、ファイルシステム全体を検索して各ファイル名を解決することです(推奨されません)。
はい。各ハードリンクを1つずつ変更する必要があります。
重要なメモです。ハードリンクを見つけることはできませんが、どのくらいのリンクがあるかがわかります。 a_* または b_* にさらにハードリンクがあることを確認することをお勧めします。これにより、リンクの少ないファイルを選択して、すでにハードリンクが最も多いファイルを削除して追加できます。
ext3にはファイルあたり最大65,000のハードリンクがあることに注意してください。昨日、この問題が発生したため、これについて言及します。
答え2
ファイル名は inode への一方向ポインタです。一般的なUnixファイルシステム構造では、ポインタを取得する直接的な方法はありません。
つまり、必要なことを行う唯一の方法は見つけることです。第二ファイリング、リンク解除、新規リンクの作成ㅏ彼らの席に。一度にすべてを行うことはできません。
また、ファイルへのハードリンクが直接見つからないため、ファイルシステム全体をスキャンする必要があります。 GNUおよびFreeBSDバージョン(少なくとも)には、inodeに基づいてファイル(名前)を見つけるために使用できるテスト済みバージョンがfind
あります。-inum
-samefile
b
GNU検索を使用すると、ハードリンクされたファイル(それb
自体を含む)を見つけて、次のリンクに置き換えるのと同様の操作を実行できますa
。
find -samefile b -exec sh -c 'ln -f a "$1"' sh {} \;