답변:
Nils의 답변에 추가하기 위해 (Google을 통해이 모든 사람을 위해 오는 경우) 기본적으로 rsync
파일 크기와 수정 시간 만 비교하여 차이가 있는지 알 수 있습니다. (이것이 다르면 더 많이 수행하지만 동일하면 중지됩니다.)
동일한 파일 크기와 마지막 수정 시간을 가진 파일의 경우에도 실제 파일 내용 을 비교하려면 체크섬을 사용하여 파일을 비교하도록 플래그 -c
를 추가하십시오 rsync
.
rsync -avnc $SOURCE $TARGET
( -u
옵션은 rsync에게 $TARGET
on보다 새로운 파일을 무시하도록 지시 $SOURCE
합니다. 내용을 비교하는 경우 원하지 않는 파일입니다 .)
--no-group --no-owner --no-perms --no-times
하거나 조합 할 수 있습니다 .
-a
대신에 암시 된 옵션의 하위 집합을 사용하십시오 -a
. 예 :rsync -rlDcnv --delete $SOURCE $TARGET
--delete
존재하는 파일 만 목록에 추가하십시오 .$TARGET
익숙하지 않은 사람들을 위해 rsync
:
rsync -rvnc --delete ${SOURCE}/ ${DEST}
-n
가장 중요한 비트- 아무것도 변경 하지 마십시오 .-rc
: 내용 만 비교 (그렇지 않으면 사용 -ac
);-v
: 파일을 나열하십시오)--delete
: 단방향 차이가 아닌 대칭을 찾습니다./
"디렉토리 내부를보고 내용 을 대상 과 비교 합니다"를 의미합니다.일반적인
rsync
출력 을 인쇄합니다 .
- 모든 "새"파일에 대해 하나의 <filename> 을 한 줄에
${SOURCE}
하나의 "삭제 <파일 이름>" 각 "새로운"파일의 라인
${DEST}
.또한 심볼릭 링크에 대해 "비정규 파일 <filename> 건너 뛰기" 와 같은 몇 가지 경고가 인쇄 될 수 있습니다 .
추신. 나는 그것이 끔찍한 PS라는 것을 알고 있지만 실제로 서둘러 추가되었습니다. 그럼에도 불구하고, 나는 이것이 유용하다고 생각합니다.
find $SOURCE -type f -exec md5sum {} \; | tee source.md5
find $DEST -type f -exec md5sum {} \; | tee dest.md5
파일 이름에 줄 바꿈이 없으면 *.md5
파일과 두 파일을 모두 정렬 할 수 diff
있습니다. (이것은 파일에 대해서만 작동합니다. 즉, 양쪽의 빈 디렉토리는 감지되지 않습니다.)
놀랍게도 6 년 안에 답이 없으면 -i
옵션을 사용 하거나 좋은 결과를 얻으므로 여기에 갈 것입니다.
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이 L
eft 또는 R
ight dir 에만 나타남을 의미합니다 .X
파일이 양쪽에 나타나지만 (.이 경우 다음 11 개 문자가 당신에게 더 많은 정보를 줄 동일하지 않습니다 것을 의미한다 s
, t
와 p
의 차이 묘사 의의 이지는, t의 IME 및 P는 - 시도 추가 정보를 원하시면 각각 ermissions을 man rsync
검색하십시오 --itemize-changes
) .파일의 소유자 / 그룹 / 권한을 비교하려면 각각 -o
/ -g
/ 옵션을 추가하십시오 -p
. 마지막으로, rsync는 기본적으로 이름, 시간 및 크기가 동일한 두 파일을 동일하게 간주합니다. 이것은 매우 빠르며 대부분의 시간보다 충분하지만 100 % 확실하게 -c
하려면 파일의 내용을 동일한 이름, 시간 및 크기와 비교하기 위해 추가하십시오 .
여기있어. 이렇게 불러
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에게 두 디렉토리 간의 차이점에 대한 정보가 포함 된 모든 파일에 대해 한 줄의 출력을 인쇄하도록 지시합니다. -n
rsync의 정상적인 동작을 억제 해야 합니다 (파일을 복사 / 삭제하여 두 디렉토리를 동기화하려고 함). 또한 -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/
이 작업을 수행하려면 몇 번의 시도가 필요했습니다. 닐스의 대답은 조지가 설명하는 것처럼 $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