rsync가 이미 최신 파일을 복사하려고하는 이유는 무엇입니까?


24

로컬 컴퓨터와 원격 컴퓨터에 동일한 파일이 두 개 있습니다. 크기는 동일하며 로컬 시스템의 파일은 원격 시스템보다 최신이지만 rsync는 여전히 파일 복사를 시도합니다.

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

rsync -nv -e "ssh -p 2222" user@host:/data/file.fif data/file.fif

( -n옵션을 사용하지 않으면 복사 작업이 시작됩니다)

Rsync 문서는 발생하지 않아야 함을 명시 적으로 나타냅니다.

Rsync  finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time.

출력 stat:

# remote file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221784    IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 286338      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1037/  platon)   Gid: ( 1047/  platon)
Access: 2013-08-08 18:40:16.907581658 +0400
Modify: 2013-07-16 12:01:09.158763284 +0400
Change: 2013-07-16 12:01:09.158763284 +0400

# local file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221792    IO Block: 4096   regular file
Device: 801h/2049d  Inode: 12987232    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1005/  platon)   Gid: ( 1003/  platon)
Access: 2013-08-08 19:02:57.146223369 +0400
Modify: 2013-08-08 19:02:57.146223369 +0400
Change: 2013-08-08 19:02:57.146223369 +0400

왜 이런 일이 발생합니까?

최신 정보:

수행 rsync --size-only결과는 복사되는 파일이 없습니다 :

delta-transmission enabled
Skovorodko_Olga_45_raw.fif is uptodate
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 14 bytes  received 114 bytes  85.33 bytes/sec
total size is 1137551966  speedup is 8887124.73 (DRY RUN)

답변:


37

빠른 검사 알고리즘은 수정 시간이나 크기가 다른 파일을 수정 된 것으로 간주합니다. 따라서 대상 디렉토리에 동일한 파일의 최신 버전이 있으면 다른 것으로 간주되어 소스 버전과 동기화됩니다.

그것은 예상되는 (그리고 더 안전한) 행동입니다. 예를 들어, ~ / src 및 ~ / dest라는 두 개의 디렉토리가 있고 각 디렉토리에 foobar 파일이 있다고 가정 해 봅시다. ~ / src / foobar에 "foo"를 쓴 다음 ~ / dest / foobar에 "bar"를 쓴다. 이제 ~ / src를 ~ / dest로 rsync합니다. 당신은 무엇을 기대합니까?

두 파일의 크기는 같지만 ~ / dest에있는 파일이 더 최신입니다. Rsync 표준 동작은 ~ / dest / foobar를 ~ / src / foobar로 바꾸는 것입니다. 물론, 파일은 동일 할 수 있고 불필요 할 수 있지만 체크섬을 수행하거나 비트 당 비트를 비교하지 않으면이를 알 수있는 방법이 없습니다.

그러한 동작을 원하지 않으면, 즉 수신자의 최신 파일을 보존하려면 -u (-update) 플래그를 사용해야합니다.

-u, --update 이것은 rsync가 대상에 존재하고 소스 파일보다 새로운 수정 된 시간을 갖는 파일을 건너 뛰도록합니다. 기존 대상 파일의 수정 시간이 원본 파일의 수정 시간과 같으면 크기가 다른 경우 업데이트됩니다.


2
그렇습니다, 그것은 실제로 문제였습니다. -t플래그 를 추가하는 것을 잊었 으므로 새 파일에서 적절한 수정 시간을 설정하지 않았으며 후속 rsync 호출이 새 파일을 업데이트하려고했습니다. 감사!
Rogach

13
@Rogach 특별한 rsync -a이유가없는 한 항상 사용하십시오 .
Gilles 'SO- 악마 중지'

나는 OP 같은 문제를지고 있다고하지만, -a이 경우 다른 문제가 발생할 것, 즉 오류 skipping directory .원인은이었다 -a포함 -r하고 나는 폴더 내에 디렉토리가 없었다 경우 그 오류를 제공합니다 생각합니다. 이 블로그 게시물
cardamom

@cardamom One은 -a기본적으로 여전히 사용 하고, --no-접두사를 사용하여 원하지 않는 옵션을 명시 적으로 비활성화합니다 . 귀하의 경우에는입니다 rsync -a --no-r.
Walf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.