ファイルのファイル名/パスを取得し、ファイルがシンボリックリンクかハードリンクかを確認するシェルスクリプトを作成しています。
唯一の問題は、それがハードリンクであるかどうかを確認する方法がわからないということです。テストファイルとして使用するために、ハードリンクとシンボリックリンクの2つのファイルを作成しました。しかし、ファイルがハードリンクかシェルスクリプトのシンボルなのか、どうすればわかりますか?
また、シンボリックリンクのターゲットパーティションをどのように見つけますか?別のパーティションにリンクされたファイルがあると仮定すると、そのソースファイルのパスをどのように見つけることができますか?
ベストアンサー1
test
Jimの回答では、のテストを使用してシンボリックリンクをテストする方法について説明します-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'
ビットは、stat
inode のみに出力されるハードリンクの数、つまりファイル名の数を示します。-gt 1
その後、1より大きいことを確認してください。
他のファイルと同様に、シンボリックリンクも複数のディレクトリに接続できるため、シンボリックリンクへのハードリンクが複数ある場合があります。