diff가 심볼릭 링크 자체를 확인하도록 하고 싶으십니까?

diff가 심볼릭 링크 자체를 확인하도록 하고 싶으십니까?

diff이 명령은 Linux에서 파일의 차이점을 확인하는 데 사용할 수 있습니다 . 나는 그것을 사용하여 두 모듈 사이의 차이점을 확인합니다 /tmp. 둘 다 .

그러나 두 모듈 모두 모듈이 디렉토리에 복사되었기 때문에 올바른 파일을 가리키지 않을 수 있는 심볼릭 링크를 가지고 있습니다 /tmp. 그러나 그것은 중요하지 않습니다. 내가 확인하고 싶은 것은 심볼릭 링크가 동일한지 여부입니다.

예를 들어, 모듈에서 심볼릭 링크는 다음과 같습니다.

/home/test/file1

다른 하나의 심볼릭 링크는 다음과 같습니다.

/etc/rc.d/whatever

diff이제 일반적으로 파일을 찾을 수 없기 때문에 오류가 발생합니다. 하지만 저는 diff링크가 유효한 파일을 가리키는지 여부에 관계없이 "이 심볼릭 링크는 동일하지 않습니다"라고 말하고 싶습니다 .

질문: 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

내가 올바르게 이해했다면 심볼릭 링크가 동일한 이론적 대상을 가리키는지, 아니면 하나가 심볼릭 링크가 아닌 경우 다른 하나가 동일한 파일에 연결되어 있는지 확인해야 합니다. 이렇게 하면 원하는 작업이 수행됩니다.

#!/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

관련 정보