2つのファイルがコマンドラインからハードリンクされているかどうかを確認するにはどうすればよいですか?たとえば、何かがこれにリンクしています:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
2つのファイルがコマンドラインからハードリンクされているかどうかを確認するにはどうすればよいですか?たとえば、何かがこれにリンクしています:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
回答:
ほとんどのファイルシステム¹では、ファイルはそのiノード番号によって一意に決定されるため、チェックする必要があるのは、2つのファイルが同じiノード番号を持ち、同じファイルシステムにあるかどうかだけです。
Ash、ksh、bash、およびzshには、ファイルの等価演算子というチェックを行う構造があります-ef
。
[ fileA -ef fileB ] && ! [ fileA -ef fileC ]
より高度な場合にls -i /path/to/file
は、ファイルのiノード番号をリストします。df -P /path/to/file
ファイルがどのファイルシステムにあるかを示します(2つのファイルが同じディレクトリにある場合、それらは同じファイルシステムにあります)。システムにstat
コマンドがある場合は、おそらくiノード番号とファイルシステム番号を表示できます(システムstat
によって異なりますので、ドキュメントを確認してください)。ディレクトリ内のハードリンクを一目で見たい場合は、ls -i | sort
(おそらくawkにパイプされて)試してください。
¹ すべてのネイティブUNIXファイルシステム、およびNTFSなどの他のいくつかのシステム。ただし、CramFSなどのエキゾチックなケースではない場合があります。
fileA -ef fileB
返すことに注意してください。0
fileA
fileB
[ .bashrc -ef .bash/.bashrc ]
は正しいです。それは「本当に仕事しませんでした」なぜ文脈がなければ、もちろん、私は考えている-あなたは、あなたがすることなく、シェルを使用することができ、正確な結果をチェックしていない可能性があり、間違ったファイルを比較することができ-ef
、...
[
にはであり、の同義語ですtest
。しかし、man [
またはman test
外部コマンドのマニュアルページが表示されますが、ほとんどすべてのシェルにはわずかに異なるオプションを持つ組み込みコマンドがあるため、シェルのマニュアルでこれを調べる必要があります。
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
stat -c %d
)。Linuxを使用している場合(stat
コマンドが与えられた場合)、シェルは[ fileA -ef fileB ]
これらすべてを直接行う必要があります。また、コマンドは、空白またはを含むファイル名で無条件に中断するか\[?*
、または-
:で始まります。常に、コマンドの中断("$(stat -c %i -- "$1")"
)を二重引用符で囲みます。
function
(ダッシュを含むために)許可された名前のPOSIX規則に違反する関数名を持つ、まったく移植性のないキーワードを使用するのですか?
$1
とを引用するのを忘れました$2
。また$()
、括弧によってコマンドの開始位置と終了位置が明確になり、ネストがより簡単になるため、バックティックの代わりに構文を使用することもできます。
最初のポスターが示唆しているように、Linuxでは次のようなものに基づいてスクリプトを書くことができます。
stat -c '%i' fileA fileB fileC
stat -c %d
)。Linuxを使用している場合(stat
コマンドが与えられた場合)、シェルは[ fileA -ef fileB ]
これらすべてを直接行う必要があります。