diff -r을 사용하여 깨진 링크를 출력하지 않고 두 디렉터리를 재귀적으로 비교합니다.

diff -r을 사용하여 깨진 링크를 출력하지 않고 두 디렉터리를 재귀적으로 비교합니다.

diff -r a b디렉토리를 재귀적으로 비교하고 있습니다 .그리고두번째. 이는 일부 끊어진 링크가 있음에도 불구하고 종종 발생합니다(두 개의 동일한 끊어진 링크).그리고두번째존재하지 않는 동일한 대상을 가리킵니다).

차이점그런 다음 이러한 경우에 대한 오류 메시지를 인쇄하고 0이 아닌 종료 코드로 종료하지만 디렉토리가 내 책과 동일하므로 자동으로 종료되고 0으로 종료되기를 원합니다.

어떻게 해야 하나요?

답변1

3.3 이상에서는 다음 에 설명된 대로 diff이 옵션을 사용해야 합니다.--no-dereference피트 할란의 답변.

안타깝게도 이전 버전은diff 심볼릭 링크 무시는 지원되지 않습니다.:

일부 파일은 디렉터리도 일반 파일도 아닙니다. 기호 링크, 장치 특수 파일, 명명된 파이프 및 소켓과 같은 특이한 파일입니다. 현재 diff심볼릭 링크는 일반 파일로 처리됩니다. 다른 특수 파일이 최상위 수준에 지정되면 일반 파일로 처리되지만 디렉터리를 비교할 때만 해당 파일의 존재를 보고합니다. 이는 patch해당 파일의 변경 사항을 표시할 수 없음을 의미합니다. 예를 들어, 심볼릭 링크가 가리키는 파일을 변경하면 diff심볼릭 링크에 대한 변경 사항이 아닌 두 파일 간의 차이점이 출력됩니다.

diff특수 파일에 대한 변경 사항은 선택적으로 구체적으로 보고되어야 하며 patch이러한 확장을 이해하려면 확장이 만들어져야 합니다.

원하는 것이 rsync를 확인하고 손실된 항목을 수정하는 것이라면 rsync 명령을 다시 실행할 수 있습니다. 그렇게 하고 싶지 않다면, 그럼디렉토리 체크섬그거면 충분할 것 같아요.

를 사용하여 이 작업을 정말로 수행하려면 심볼릭 링크 건너뛰기를 diff사용 find하고 각 파일에 대해 개별적으로 diff를 실행할 수 있습니다. 디렉토리 전달그리고두번째매개변수로:

#!/bin/bash
# Skip files in $1 which are symlinks
for f in `find $1/* ! -type l`
do
    # Suppress details of differences
    diff -rq $f $2/${f##*/}
done

또는 한 줄로:

for f in `find a/* ! -type l`;do diff -rq $f b/${f##*/};done

이렇게 하면 내용이 다른 파일을 식별할 수 있습니다.하지만 거기엔 없어두번째.

알아채다:

  • 우리는 심볼릭 링크를 완전히 건너뛰기 때문에 심볼릭 링크 이름이 존재하지 않는지 알 수 없습니다.두번째. 이 작업을 수행해야 하는 경우 모든 심볼릭 링크를 식별한 다음 해당 링크가 존재하는지 명시적으로 확인하는 두 번째 조회 프로세스가 필요합니다.두번째.
  • 추가 파일은 다음 위치에 있습니다.두번째목록이 다음에서 작성되었기 때문에 인식되지 않습니다.. 귀하의 시나리오에서는 이것이 문제가 되지 않을 수도 있습니다 rsync.

답변2

버전 3.3부터 GNU는 diff기호 링크 역참조가 아니라 기호 링크가 가리키는 경로 비교를 지원합니다.

diffutilsGNU 3.3 이상을 설치 하고 이 --no-dereference옵션을 사용하세요. 이에 대한 지름길은 없습니다.

다음과 같거나 다음과 같은 경우 진단은 자동으로 유지됩니다.

심볼릭 링크 /tmp/noderef/a/symlink/tmp/noderef/b/symlink다른 것

답변3

최신 버전을 사용할 수 있습니다.diff

diffGNU 3.3에는 대상이 아닌 기호 링크 자체를 비교할 수 있는 diffutils옵션이 포함되어 있습니다 . --no-dereference서로 다르면 보고하고, 동의하면 조용히 있고 문제가 발생하더라도 상관하지 않습니다.

이 옵션이 언제 추가되었는지는 알 수 없습니다. 2.8.1에는 없습니다.

답변4

이 코드는 두 폴더의 파일을 비교하지만 첫 번째 폴더의 파일 이름을 기준으로 사용합니다.

diffDir() {
    A=$1
    B=$2
    for src in `find $A ! -type l` ; do
        dst=/data/f-stack/freebsd/${src#$A}
        if [ -f $dst ]; then
            GIT_PAGER= git diff --no-ext-diff $src $dst;
        fi
    done
}

diffDir /data/freebsd/freebsd11.0/sys/ /data/f-stack/freebsd/

관련 정보