両方のファイルがハードリンクされていますか?

両方のファイルがハードリンクされていますか?

コマンドラインで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同じ)と評価されたら、「同じ」を印刷します。それ以外の場合は何も出力されません。

関連情報