내가 사용하고 diff -r a b
반복적으로 비교 디렉토리에 와 B . 종종 깨진 링크 ( a 및 b 디렉토리 모두에서 동일한 깨진 링크가 존재하고 존재하지 않는 동일한 대상을 가리키는) 가 있지만 종종 발생합니다 .
그런 다음 diff 는 이러한 경우 오류 메시지를 출력하고 0이 아닌 종료 코드로 종료하지만 침묵을 유지하고 디렉토리가 내 책에서 동일하므로 0으로 종료하십시오.
어떻게해야합니까?
내가 사용하고 diff -r a b
반복적으로 비교 디렉토리에 와 B . 종종 깨진 링크 ( a 및 b 디렉토리 모두에서 동일한 깨진 링크가 존재하고 존재하지 않는 동일한 대상을 가리키는) 가 있지만 종종 발생합니다 .
그런 다음 diff 는 이러한 경우 오류 메시지를 출력하고 0이 아닌 종료 코드로 종료하지만 침묵을 유지하고 디렉토리가 내 책에서 동일하므로 0으로 종료하십시오.
어떻게해야합니까?
답변:
의 버전 3.3 이상 에서는 Pete Harlan의 답변에 설명 된대로 옵션을 diff
사용해야합니다 .--no-dereference
불행히도, 이전 버전은 diff
심볼릭 링크 무시를 지원하지 않습니다 .
일부 파일은 디렉토리 나 일반 파일이 아닙니다. 심볼릭 링크, 장치 특수 파일, 명명 된 파이프 및 소켓과 같은 특이한 파일입니다. 현재
diff
기호 링크를 일반 파일처럼 취급합니다. 다른 특수 파일은 최상위 레벨에서 지정된 경우 일반 파일처럼 취급하지만 디렉토리를 비교할 때 해당 파일의 존재를보고합니다. 이는 해당patch
파일에 대한 변경 사항을 나타낼 수 없음을 의미 합니다. 예를 들어, 심볼릭 링크가 가리키는 파일을 변경하면 심볼릭 링크를 변경하는diff
대신 두 파일의 차이를 출력합니다.
diff
선택적으로 변경 사항을 특수 파일에 특별하게보고patch
해야하며 이러한 확장자를 이해하도록 확장되어야합니다.
당신이 원하는 모든 rsync를 확인하는 것 (그리고 아마도 누락 된 것을 수정하는 것)이라면 rsync 명령을 두 번 실행할 수 있습니다. 그렇게하고 싶지 않다면 , 디렉토리를 체크섬하는 것으로 충분할 수 있습니다.
이 작업을 실제로 수행 하려면 심볼릭 링크를 건너 뛰고 각 파일에서 개별적으로 diff를 실행 diff
하는 find
데 사용할 수 있습니다 . 디렉토리 a 와 b 를 인수로 전달하십시오.
#!/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
컨텐츠가 다른 파일 또는 a에 있지만 b에 없는 파일을 식별합니다 .
참고 :
rsync
for f in
. 유형 l ;do echo $f b/${f#*/};done
. 나는 지금 이것을 테스트 할 시간이 없다. 그것이 작동하는지 알려주세요.
$(xxx)
백틱 대신 사용하십시오 . 백틱 대칭은 읽기가 어렵고 중첩을 방지합니다. 1과 2에 대해서는 stackoverflow.com/questions/11366184/…를