
diff
このコマンドは、Linuxでファイルの違いを確認するために使用できます。私はそれを使用して2つのモジュール間の違いを確認します/tmp
。両方。
ただし、両方のモジュールには、モジュールがディレクトリにコピーされたため、正しいファイルを指さない可能性があるシンボリックリンクがあります/tmp
。しかし、それは問題ではありません。私が確認したいのはシンボリックリンクが同じかどうかです。
たとえば、モジュールでは、シンボリックリンクは次のようになります。
/home/test/file1
もう1つのシンボリックリンクは次のとおりです。
/etc/rc.d/whatever
diff
通常、ファイルが見つからないため、エラーが発生します。しかし、私はdiff
リンクが有効なファイルを指しているかどうかに関係なく、「このシンボリックリンクは同じではありません」と言いたいと思います。
Q:diff
リンクをたどろうとせずにリンク自体を区別するにはどうすればよいですか?
答え1
diff
GNU 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 -> c
と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)
ここでは区切り文字(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