[unix] 파일을 동기화하는 가장 좋은 방법-기존 파일 만 복사하고 대상보다 최신 인 경우에만 복사

우분투 12.04에서 로컬 로이 동기화를 수행하고 있습니다. 파일은 일반적으로 작은 텍스트 파일 (코드)입니다.

source디렉토리 에서 (mtime 스탬프 보존) target을 복사하고 싶지만 파일이 target 이미 존재 하고 의 파일 보다 오래된 경우에만 복사하려고합니다 source.

그래서에서 최신 파일 만 복사 source하지만 파일이 있어야 target하거나 복사되지 않습니다. ( source보다 많은 파일이 target있습니다.)

실제로 source여러 target디렉토리 에서 여러 디렉토리 로 복사 합니다. 솔루션 선택에 영향을 미치는 경우에 이것을 언급합니다. 그러나 target필요한 경우 매번 새로운 것을 지정하여 명령을 여러 번 쉽게 실행할 수 있습니다 .



답변

나는 당신 rsync이 이것을 할 수 있다고 믿습니다 . 주요 관찰은 --existing--update스위치 를 사용해야 할 것 입니다.

        --existing              skip creating new files on receiver
        -u, --update            skip files that are newer on the receiver

이와 같은 명령은 다음과 같습니다.

$ rsync -avz --update --existing src/ dst

다음과 같은 샘플 데이터가 있다고 가정하십시오.

$ mkdir -p src/; touch src/file{1..3}
$ mkdir -p dst/; touch dst/file{2..3}
$ touch -d 20120101 src/file2

다음과 같이 보입니다.

$ ls -l src/ dst/
dst/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

src/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file1
-rw-rw-r--. 1 saml saml 0 Jan  1  2012 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

이제이 디렉토리를 동기화하면 아무 일도 일어나지 않습니다.

$ rsync -avz --update --existing src/ dst
sending incremental file list

sent 12 bytes  received 31 bytes  406.00 bytes/sec
total size is 0  speedup is 0.00

우리의 경우 touch소스 파일 그래서 새로운 있다는 :

$ touch src/file3
$ ls -l src/file3
-rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3

다른 rsync명령 실행 :

$ rsync -avz --update --existing src/ dst
sending incremental file list
file3

sent 115 bytes  received 31 bytes  292.00 bytes/sec
total size is 0  speedup is 0.00

우리는 file3새로운 것이기 때문에에 존재한다는 것을 알 수 있습니다 dst/.

테스팅

명령을 느슨하게 풀기 전에 제대로 작동하려면 다른 rsync스위치를 사용하는 것이 좋습니다 --dry-run. 또 다른 -v것을 추가 하여 rsync출력이 더 장황합니다.

$ rsync -avvz --dry-run --update --existing src/ dst
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
file1
file2 is uptodate
file3 is newer
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 88 bytes  received 21 bytes  218.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)


답변