でファイルの inode 番号を見つけることができます
ls -i
そして
ls -l
参照カウント (特定の inode へのハードリンクの数) を表示します
inode 番号を見つけたら、同じ inode を持つすべてのファイルを検索できます:
find . -inum NUM
現在のディレクトリ (.) に inode NUM のファイル名が表示されます
あなたの質問に対する明確な答えはありません。シンボリック リンクとは異なり、ハードリンクは「元のファイル」と見分けがつきません。
ディレクトリ エントリは、ファイル名と inode へのポインタで構成されます。 inode には、ファイルのメタデータと実際のファイルの内容 (へのポインタ) が含まれています。ハード リンクを作成すると、別のファイル名 + 同じ inode への参照が作成されます。これらの参照は一方向です (少なくとも一般的なファイルシステムでは)。inode は参照カウントのみを保持します。どれが「元の」ファイル名かを確認する固有の方法はありません。
ちなみに、これがファイルを「削除」するシステムコールが unlink
と呼ばれる理由です。 .ハードリンクを削除するだけです。データが添付された i ノードは、i ノードの参照カウントが 0 になった場合にのみ削除されます。
特定の i ノードへの他の参照を見つける唯一の方法は、ファイル システムを徹底的に検索して、どのファイルが問題の i ノードを参照しているかを確認することです。シェルから「test A -ef B」を使用して、このチェックを実行できます。
UNIX にはハード リンクとシンボリック リンクがあります ("ln"
で作成) と "ln -s"
それぞれ)。シンボリック リンクは、別のファイルへの実際のパスを含む単なるファイルであり、ファイル システムをまたがることができます。
ハード リンクは、UNIX の黎明期から存在していました (覚えているのはかなり前のことです)。 正確を参照する 2 つのディレクトリ エントリです。 基礎となるデータは同じです。ファイル内のデータは inode
で指定されます .ファイル システム上の各ファイルは i ノードを指していますが、各ファイルが一意の i ノードを指している必要はありません。ハード リンクはそこから来ています。
inode は特定のファイル システムに対してのみ一意であるため、(シンボリック リンクとは異なり) ハード リンクは同じファイル システム上になければならないという制限があります。シンボリック リンクとは異なり、特権ファイルは存在しないことに注意してください。それらはすべて同等です。データ領域は、all の場合にのみ解放されます その inode を使用しているファイルは削除されます (すべてのプロセスもそれを閉じますが、それは別の問題です)。
"ls -i"
を使用できます 特定のファイルの inode を取得するコマンド。その後、 "find <filesystemroot> -inum <inode>"
を使用できます コマンドを使用して、指定された inode を持つファイル システム上のすべてのファイルを検索します。
まさにそれを行うスクリプトを次に示します。次のように呼び出します:
findhardlinks ~/jquery.js
そして、そのファイルのハードリンクであるそのファイルシステム上のすべてのファイルを見つけます:
[email protected]:~# ./findhardlinks /home/pax/jquery.js
Processing '/home/pax/jquery.js'
'/home/pax/jquery.js' has inode 5211995 on mount point '/'
/home/common/jquery-1.2.6.min.js
/home/pax/jquery.js
これがスクリプトです。
#!/bin/bash
if [[ $# -lt 1 ]] ; then
echo "Usage: findhardlinks <fileOrDirToFindFor> ..."
exit 1
fi
while [[ $# -ge 1 ]] ; do
echo "Processing '$1'"
if [[ ! -r "$1" ]] ; then
echo " '$1' is not accessible"
else
numlinks=$(ls -ld "$1" | awk '{print $2}')
inode=$(ls -id "$1" | awk '{print $1}' | head -1l)
device=$(df "$1" | tail -1l | awk '{print $6}')
echo " '$1' has inode ${inode} on mount point '${device}'"
find ${device} -inum ${inode} 2>/dev/null | sed 's/^/ /'
fi
shift
done