シンボリックリンク自体を差分チェックするのは暑いですか?


8

Linuxでは、コマンドdiffを使用してファイルの違いを確認できます。私はそれを使用して、両方にコピーされた2つのモジュール間の違いをチェックします/tmp

ただし、モジュールが/tmpディレクトリにコピーされているため、両方のモジュールにシンボリックリンクがあり、正しいファイルを指していない可能性があります。しかし、これは問題ではありません。確認したいのは、シンボリックリンクが同じかどうかです。

たとえば、1つのモジュールでシンボリックリンクは

/home/test/file1

もう1つには、シンボリックリンクがあります。

/etc/rc.d/whatever

diff-一般に-ファイルを見つけることができないため、エラーがスローされます。ただしdiff、リンクが有効なファイルを指しているかどうかに関係なく、「ねえ、これらのシンボリックリンクは同じではありません」と言いたいです。

質問:diffリンクをたどるのではなく、リンク自体を比較することはどのようにして可能ですか?

回答:


6

オプション(およびおそらく--recursiveオプション)を使用してGNU diffバージョン3.3以降を試してください--no-dereference

diff --recursive --no-dereference tree1root tree2root

これを少し具体化してもらえますか?おそらくそれがどのように使用されるかの例を挙げますか?これは完全に良い答えの作り方を持っていますが、私たちはここで私たちの答えがもう少し明示的で冗長であることを望みます。
terdon

3

バージョン3.3以降、GNU diffはシンボリックリンクの逆参照をサポートしませんが、それらが指すパスを比較します。

GNU diffutils> = 3.3をインストールし、「-no-dereference」オプションを使用します。そのための短いオプションはありません。

パスが等しい場合、診断はサイレントになります、または:

Symbolic links /tmp/noderef/a/symlink and /tmp/noderef/b/symlink differ

パスが異なる場合。


1

GNUツールの場合:

diff <(cd dir1 && find . -type l -printf '%p -> %l\n'|sort) \
     <(cd dir2 && find . -type l -printf '%p -> %l\n'|sort)

厳密に言えば、それはと呼ばれるシンボリックリンクを区別することはできませんaポイントにあることb -> cと呼ばれる1 a -> bということにポイントc改行文字を含むファイル名で問題が発生しないように言及し、が、より強固なより読みやすい出力の場合となります:

diff <(cd dir1 && find . -type l -printf '%p // %l\0'|tr '\n\0' '\0\n'|sort) \
     <(cd dir2 && find . -type l -printf '%p // %l\0'|tr '\n\0' '\0\n'|sort)

そこで、//セパレーターとして使用し(それ以外の場合はfindfor の出力では発生しません%p)、改行文字をNUL文字(%pnor の展開では発生しません)に変換します%l


1

私が正しく理解している場合は、シンボリックリンクが同じ理論上の宛先を指していること、または一方がシンボリックリンクではない場合、他のファイルが同じファイルにリンクしていることを確認する必要があります。これはあなたが望むことをするはずです:

#!/bin/bash

if [[ "$(readlink -m -- "$1")" == "$(readlink -m -- "$2")" ]]; then
    echo "files match"
else
    echo "files don't match"
    exit 1
fi
$ > foo 
$ ln -s foo bar
$ ln -s foo baz
$ ./script bar baz
files match
$ ./script bar foo
files match
$ ln -sf qux bar
$ ./script bar foo
files don't match

@StephaneChazelasこれは私のエラーです。使用するつもり-mではなく、-fです。ありがとう!
Chris Down

厳密に言えば、シンボリックリンクのターゲット内の末尾の改行文字の数のみが異なる場合、これは機能しません。
ステファンChazelas

私も使用しません-m
ステファンChazelas

@StephaneChazelasどのような理由で?それがなければ、同じファイルを実際に指す相対シンボリックリンクはこの比較に失敗します。
Chris Down

/home/test/file1がへのシンボリックリンクである場合/etc/rc.d/whatever、または両方がへのシンボリックリンクである/場合、それらは同じであると報告されます。私はOPがシンボリックリンクに保存されている「パス」の違いを確認したいと思います[[ a -ef b ]]。同じファイルに解決されるかどうかではありません。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.