コマンドラインで2つのファイルがハードリンクされているかどうかはどうすればわかりますか?たとえば、次のように接続します。
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
答え1
ほとんどのファイルシステムでは、ファイルはそのファイルによって一意に識別されます。インデックスノードしたがって、確認する必要があるのは、2つのファイルのinode番号が同じで、同じファイルシステムにあるかどうかです。
Ash、ksh、bash、およびzshには、ファイル同等演算子と呼ばれるチェックを実行する構成があります-ef
。
[ fileA -ef fileB ] && ! [ fileA -ef fileC ]
高度なケースでは、ls -i /path/to/file
ファイルの inode 番号をリストします。df -P /path/to/file
ファイルがあるファイルシステムを表示します(2つのファイルが同じディレクトリにある場合は同じファイルシステムにあります)。システムに対応するstat
コマンドがある場合は、inodeとファイルシステム番号が表示されることがあります(stat
システムによって異なるため、マニュアルを確認してください)。ディレクトリ内のハードリンクをすばやく移動するには、次のようにしますls -i | sort
(おそらくawkによるパイプ)。
1 すべてのネイティブUnixファイルシステムなどの一部(NTFSなど)。しかし、CramFSのような特別なケースではないかもしれません。
答え2
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
答え3
最初のポスターが提案したように、Linuxで次のスクリプトを書くことができます。
stat -c '%i' fileA fileB fileC
答え4
組み込みのbash演算子を使用すると、非常に簡単にこれを行うことができます-ef
。
[[ file1 -ef file2 ]] && echo Same
条件が真(file1
そしてfile2
同じ)と評価されたら、「同じ」を印刷します。それ以外の場合は何も出力されません。