rsync 디렉토리 비교?


63

두 디렉토리를 rsync와 비교하고 차이점 만 인쇄 할 수 있습니까? 드라이-런 옵션이 있지만 상세 수준을 특정 수준으로 높이면 비교 된 모든 파일이 표시됩니다.

ls -alR그리고 diff모든 라인이 서로 다른 만드는 소스의 하드 링크가 있기 때문에 어떤 옵션은 여기에 없다. (물론, 나는이 열을 perl로 삭제할 수 있습니다.)


답변:


46

rsync -avun --delete두 방향 모두에서 무언가를 실행해야 할 것 입니다.

그러나 실제로 무엇을 달성하려고합니까?

업데이트 :

rsync -avun --delete $TARGET $SOURCE |grep "^deleting " 대상 디렉토리에 존재하지 않는 파일 목록을 제공합니다.

각 줄이 인쇄되기 때문에 "grep delet": delet ..file ..

rsync -avun $SOURCE $TARGET "다른"파일 (새 파일 포함) 목록을 제공합니다.


49

Nils의 답변에 추가하기 위해 (Google을 통해이 모든 사람을 위해 오는 경우) 기본적으로 rsync파일 크기와 수정 시간 만 비교하여 차이가 있는지 알 수 있습니다. (이것이 다르면 더 많이 수행하지만 동일하면 중지됩니다.)

동일한 파일 크기와 마지막 수정 시간을 가진 파일의 경우에도 실제 파일 내용 을 비교하려면 체크섬을 사용하여 파일을 비교하도록 플래그 -c를 추가하십시오 rsync.

rsync -avnc $SOURCE $TARGET

( -u옵션은 rsync에게 $TARGETon보다 새로운 파일을 무시하도록 지시 $SOURCE합니다. 내용을 비교하는 경우 원하지 않는 파일입니다 .)


6
데이터가 동일한 것만 신경 쓰면 필요에 따라 데이터를 추가 --no-group --no-owner --no-perms --no-times하거나 조합 할 수 있습니다 .
flungo

1
@flungo, 또는 -a대신에 암시 된 옵션의 하위 집합을 사용하십시오 -a. 예 :rsync -rlDcnv --delete $SOURCE $TARGET
maxschlepzig

다음에 --delete존재하는 파일 만 목록에 추가하십시오 .$TARGET
Tom Hale

25

익숙하지 않은 사람들을 위해 rsync:

rsync -rvnc --delete ${SOURCE}/ ${DEST}
  • -n가장 중요한 비트- 아무것도 변경 하지 마십시오 .
  • -rc: 내용 만 비교 (그렇지 않으면 사용 -ac);
  • -v : 파일을 나열하십시오)
  • --delete : 단방향 차이가 아닌 대칭을 찾습니다.
  • 마지막으로 /"디렉토리 내부를보고 내용 을 대상 과 비교 합니다"를 의미합니다.

일반적인 rsync출력 을 인쇄합니다 .

  • 모든 "새"파일에 대해 하나의 <filename> 을 한 줄에${SOURCE}
  • 하나의 "삭제 <파일 이름>" 각 "새로운"파일의 라인 ${DEST}.

  • 또한 심볼릭 링크에 대해 "비정규 파일 <filename> 건너 뛰기" 와 같은 몇 가지 경고가 인쇄 될 수 있습니다 .

추신. 나는 그것이 끔찍한 PS라는 것을 알고 있지만 실제로 서둘러 추가되었습니다. 그럼에도 불구하고, 나는 이것이 유용하다고 생각합니다.


PPS. 다른 방법으로는

find $SOURCE -type f -exec md5sum {} \; | tee source.md5
find $DEST   -type f -exec md5sum {} \; | tee dest.md5

파일 이름에 줄 바꿈이 없으면 *.md5파일과 두 파일을 모두 정렬 할 수 diff있습니다. (이것은 파일에 대해서만 작동합니다. 즉, 양쪽의 빈 디렉토리는 감지되지 않습니다.)


15

놀랍게도 6 년 안에 답이 없으면 -i옵션을 사용 하거나 좋은 결과를 얻으므로 여기에 갈 것입니다.

TLDR-그냥 명령을 보여줘

rsync -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L             /'
rsync -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R             /'
rsync -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'

출력 이해

다음은 출력 예입니다.

L             file-only-in-Left-dir
R             file-only-in-right-dir
X >f.st...... file-with-dif-size-and-time
X .f...p..... file-with-dif-perms

모든 줄의 첫 문자를 참고하십시오.

  • L/ R는 파일 / dir이 Left 또는 Right dir 에만 나타남을 의미합니다 .
  • X파일이 양쪽에 나타나지만 (.이 경우 다음 11 개 문자가 당신에게 더 많은 정보를 줄 동일하지 않습니다 것을 의미한다 s, tp의 차이 묘사 의의 이지는, t의 IME 및 P는 - 시도 추가 정보를 원하시면 각각 ermissions을 man rsync검색하십시오 --itemize-changes) .

사용할 수있는 추가 옵션

파일의 소유자 / 그룹 / 권한을 비교하려면 각각 -o/ -g/ 옵션을 추가하십시오 -p. 마지막으로, rsync는 기본적으로 이름, 시간 및 크기가 동일한 두 파일을 동일하게 간주합니다. 이것은 매우 빠르며 대부분의 시간보다 충분하지만 100 % 확실하게 -c하려면 파일의 내용을 동일한 이름, 시간 및 크기와 비교하기 위해 추가하십시오 .

TLDR-전화 할 스크립트 만주세요

여기있어. 이렇게 불러

diff-dirs Left_Dir Right_Dir [options]

"사용할 수있는 추가 옵션"섹션에서 위에서 언급 한 모든 옵션도 여기에 적용됩니다.

#!/bin/bash
# Compare two directories using rsync and print the differences
# CAUTION: options MUST appear after the directories
#
# SYNTAX
#---------
# diff-dirs Left_Dir Right_Dir [options]
#
# EXAMPLE OF OUTPUT
#------------------
# L             file-only-in-Left-dir
# R             file-only-in-right-dir
# X >f.st...... file-with-dif-size-and-time
# X .f...p..... file-with-dif-perms
#
# L / R mean that the file/dir appears only at the `L`eft or `R`ight dir. 
#
# X     means that a file appears on both sides but is not the same (in which
#       case the next 11 characters give you more info. In most cases knowing
#       that s,t,T and p depict differences in Size, Time and Permissions 
#       is enough but `man rsync` has more info
#       (look at the --itemize-changes option)
#
# OPTIONS
#---------
# All options are passed to rsync. Here are the most useful for the purpose
# of directory comparisons:
#
# -c will force comparison of file contents (otherwise only
#    time & size is compared which is much faster)
#
# -p/-o/-g will force comparison of permissions/owner/group

if [[ -z $2 ]] ; then
    echo "USAGE: $0 dir1 dir2 [optional rsync arguments]"
    exit 1
fi

set -e

LEFT_DIR=$1; shift
RIGHT_DIR=$1; shift
OPTIONS="$*"

# Files that don't exist in Right_Dir
rsync $OPTIONS -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L             /'
# Files that don't exist in Left_Dir
rsync $OPTIONS -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R             /'
# Files that exist in both dirs but have differences
rsync $OPTIONS -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'

어떻게 작동합니까?

우리는 다음과 같이 rsync를 호출합니다.

rsync -rin ...

-i( --itemize-changes)를 사용 하여 rsync에게 두 디렉토리 간의 차이점에 대한 정보가 포함 된 모든 파일에 대해 한 줄의 출력을 인쇄하도록 지시합니다. -nrsync의 정상적인 동작을 억제 해야 합니다 (파일을 복사 / 삭제하여 두 디렉토리를 동기화하려고 함). 또한 -r모든 파일 / 하위 디렉토리에 대해 재귀 적으로 작업 해야 합니다.

rsync를 세 번 호출합니다.

첫 번째 호출 : Dir_B에 존재하지 않는 파일을 인쇄합니다. --ignore-existing양쪽에 존재하는 파일을 무시 하려면 사용해야 합니다.

rsync -rin --ignore-existing $DIR_A/ $DIR_B/

두 번째 전화 : 이전과 동일하지만 DIR_A / DIR_B의 순서를 바꿉니다.

세 번째 호출 : 마지막으로 --existing두 디렉토리에 나타나는 파일 만 확인합니다.

rsync -rin --existing $DIR_A/ $DIR_B/

다른 사람에 대해 모르지만 스크립트를 사용하고 있습니다. 훌륭한 일! 감사합니다
Marinaio

7

귀하의 질문에 따르면 ls 에서 diff를 사용하고 싶지 않지만 디렉토리에서 diff를 재귀 적으로 사용할 수도 있습니다.

diff -rq DIR1 DIR2

2

이 작업을 수행하려면 몇 번의 시도가 필요했습니다. 닐스의 대답은 조지가 설명하는 것처럼 $TARGET끝까지 /끝나야합니다.

다음은 후행을 명시 적으로 추가하는 버전입니다 /.

rsync -avun --delete ${TARGET}/ ${SOURCE}  | sed -ne 's/^deleting *//p'

${SOURCE}디렉토리 아래에 있지만 디렉토리 아래에없는 파일 목록을 제공합니다 ${TARGET}.

출력 줄에서 sed행간을 제거하고 deleting해당 줄만 인쇄 하기 위해 여기를 사용 합니다.

파일 내용을 비교하는 것이 사용 사례의 경우 속도가 훨씬 느리기 때문에 rsync옵션을 사용하지 않으며 -c이러한 경우 파일 크기와 수정 시간 만 비교해도 충분합니다. 내 컴퓨터가 시계 왜곡 문제로 고생하거나 타임 스탬프가 악의적으로 변경된 것으로 의심 할 이유가 없습니다. 또한 결과 -c는 파일 삭제 결정을 변경할 수 없으며 파일을 업데이트 또는 보관하기로 한 결정 만 변경합니다.

또한 사용 -u하고 -a(보다는 -r나중에 명령 줄을 다시 사용에서 선택 디렉토리와 파일을 복사를 변경할 수 있도록) ${SOURCE}${TARGET}다음과 같이 :

rsync -avu ${SOURCE}/{dirA,dirB,fileX} ${TARGET}   # copy some files

0

이 작업을 수행하는 또 다른 아이디어가 있습니다.

rsync -rn --out-format=FILEDETAIL::%n  $TARGET $SOURCE  | grep "^FILEDETAIL"

"FILEDETAIL ::"을 명령 출력과 일치시킬 수 있습니다. 또한 문자열 "FILEDETAIL ::"을 변경할 수 있습니다. "% n"은 파일 이름입니다.

-r 이것은 rsync에게 디렉토리를 재귀 적으로 복사하도록 지시합니다.

-n 이렇게하면 rsync가 변경되지 않은 시험 실행을 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.