diffにシンボリックリンク自体を確認させたいですか?

diffにシンボリックリンク自体を確認させたいですか?

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

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

たとえば、モジュールでは、シンボリックリンクは次のようになります。

/home/test/file1

もう1つのシンボリックリンクは次のとおりです。

/etc/rc.d/whatever

diff通常、ファイルが見つからないため、エラーが発生します。しかし、私はdiffリンクが有効なファイルを指しているかどうかに関係なく、「このシンボリックリンクは同じではありません」と言いたいと思います。

Q:diffリンクをたどろうとせずにリンク自体を区別するにはどうすればよいですか?

答え1

diffGNU 3.3以降の--no-dereferenceオプション(そしておそらく --recursive オプション)を試してみてください:

diff --recursive --no-dereference tree1root tree2root

これにより、シンボリックリンクをたどる--no-dereferenceことができません。diffそれでもターゲットを比較して違うかどうか教えてくれます。

答え2

バージョン3.3以降、GNU diffはシンボリックリンクの逆参照ではなく、シンボリックリンクが指すパス比較をサポートしています。

GNU diffutils> = 3.3をインストールし、 '--no-dereference'オプションを使用してください。これにはショートカットオプションはありません。

パスが同じ場合、診断は自動的に維持されます。

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

パスが異なる場合。

答え3

GNUツールの使用:

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

a厳密に言えば、これはポインタと呼ばれるシンボリックリンクb -> ca -> 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)

ここでは区切り文字(for出力//には表示されません)を使用し、改行文字をNUL文字(Nor拡張には表示されません)に変換します。find%p%p%l

答え4

私が正しく理解している場合は、シンボリックリンクが同じ理論的ターゲットを指すのか、または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

関連情報