ファイルがハードリンクかシンボリックリンクかを確認しますか?

ファイルがハードリンクかシンボリックリンクかを確認しますか?

ファイルのファイル名/パスを取得し、ファイルがシンボリックリンクかハードリンクかを確認するシェルスクリプトを作成しています。

唯一の問題は、それがハードリンクであるかどうかを確認する方法がわからないということです。テストファイルとして使用するために、ハードリンクとシンボリックリンクの2つのファイルを作成しました。しかし、ファイルがハードリンクかシェルスクリプトのシンボルなのか、どうすればわかりますか?

また、シンボリックリンクのターゲットパーティションをどのように見つけますか?別のパーティションにリンクされたファイルがあると仮定すると、そのソースファイルのパスをどのように見つけることができますか?

ベストアンサー1

testJimの回答では、のテストを使用してシンボリックリンクをテストする方法について説明します-L

しかし、厳密に言えば、「ハードリンク」をテストすることは望むものではありません。ハードリンクの仕組みは、Unixがファイルを処理する方法によって異なります。各ファイルは inode で表されます。その後、単一のinodeにゼロ個以上の値があります。名前またはディレクトリエントリまたは技術的に言えば、ハードリンク(「文書」と呼ぶもの)。

幸いなことに、このstatコマンド(利用可能な場合)は、inodeにいくつの名前があるかを知らせることができます。

したがって、次のようなものを探しています(ここではGNUまたはbusyboxの実装を想定していますstat)。

if [ "$(stat -c %h -- "$file")" -gt 1 ]; then
    echo "File has more than one name."
fi

この-c '%h'ビットは、statinode のみに出力されるハードリンクの数、つまりファイル名の数を示します。-gt 1その後、1より大きいことを確認してください。

他のファイルと同様に、シンボリックリンクも複数のディレクトリに接続できるため、シンボリックリンクへのハードリンクが複数ある場合があります。

おすすめ記事