출력을 이해하려고 노력 중입니다 rsync -n --update -av dir1/ dir2/
. 여기에는 dir2
존재하지 않거나 최신인 파일 뿐만 아니라 모든 디렉터리가 나열되어야 한다고 들었습니다 dir1
. 테스트 디렉토리에서 이것을 시도했습니다.
test
test/testDir1
test/testDir1/testDir11
test/testDir1/testDir11/testFile3.txt
test/testDir1/testFile2.txt
test/testFile1.txt
test/testDir2
에 복사하고 testCopy
변경한 test/testDir1/testFile2.txt
다음 실행하면 rsync -n --update -av test/ testCopy/
출력은 다음과 같습니다.
./
testDir1/
testDir1/testFile2.txt
testDir1/testDir11/
testDir2/
출력이 어떻게 작동해야 하는지 들은 내용을 바탕으로 이것이 제가 기대하는 것입니다.
하지만, 다른 더 큰 실제 디렉토리 쌍에 대해 동일한 명령을 시도했지만 매우 다른 동작을 얻었습니다. 다음은 동기화해야 하는 디렉터리 쌍의 두 가지 예입니다.
./
어떤 경우에는 디렉터리(620)와 파일이 많지만 출력은 . 나열된 파일이 없습니다.반면에 일부(7/72) 디렉토리가 나열되어 있습니다. 나열된 파일이 없습니다.
이 출력이 나에게 무엇을 보여주고 있는지 이해할 수 없습니까?
답변1
지적할 수 있는 명확한 문서는 없지만 이것이 일어나고 있다고 생각합니다.
을 사용하면 -v|--verbose
전송할 파일( -n|--dry-run
지정한 경우 전송할 파일)이 나열됩니다. 디렉토리는 Unix 계열 운영 체제의 단순한 파일이며 동일한 규칙에 따라 나열됩니다.
그럼 디렉토리는 언제 이전되나요? (명백히 대상에 존재하지 않는 경우를 제외하고) 이를 지정한다고 가정하면 -t|--times
(암시적으로 -a
) 타임스탬프가 변경될 때 전송됩니다. 속성이 변경되면 비슷한 규칙이 적용됩니다.
디렉토리의 타임스탬프는 언제 변경됩니까? 관찰에 따르면 이는 (적어도) 파일이 단순히 속성(예: 시간)을 변경하는 경우가 아니라 디렉터리의 파일이 생성되거나 이름이 변경되는 경우입니다.
따라서 touch
에서 새 파일을 생성 testDir11
하면 testDir11
타임스탬프가 변경되어 전송이 가능해집니다. 그러나 기존 파일이 있으면 touch
디렉터리는 변경되지 않습니다.
답변2
요점:
복사(명령
cp
)는 rsync와 다른 작업을 수행합니다. 우선, 타임스탬프를 복사하지 않습니다.이
rsync
옵션은--update
최신 파일만 업데이트합니다.
당신이 하고 있는 일이 디렉토리의 복사본이라고 가정하면, 구체적으로 다음과 같습니다:
#!/bin/bash
mkdir -p test/testDir2
mkdir -p test/testDir1/testDir11
echo "yes3" > test/testDir1/testDir11/testFile3.txt
echo "yes2" > test/testDir1/testFile2.txt
echo "yes1" > test/testFile1.txt
sleep 3
cp -r test/ testcopy/
그러면 비슷한 구조를 가진 두 개의 디렉터리가 생성됩니다.
$ tree test
test
├── testDir1
│ ├── testDir11
│ │ └── testFile3.txt
│ └── testFile2.txt
├── testDir2
└── testFile1.txt
그리고 다음을 복사하세요.
$ tree testCopy/
testCopy/
├── testDir1
│ ├── testDir11
│ │ └── testFile3.txt
│ └── testFile2.txt
├── testDir2
└── testFile1.txt
이러한 디렉토리는 동일해 보이지만 그렇지 않습니다. 이전 sleep 3
명령 은 cp
모든 파일의 시간을 다르게 만듭니다 testCopy
.
$ ls -la --time-style=full-iso test/testFile1.txt
-rw-r--r-- 1 user user 5 2017-06-22 20:22:13.704512555 0000 test/testFile1.txt
$ ls -la --time-style=full-iso testCopy/testFile1.txt
-rw-r--r-- 1 user user 5 2017-06-22 20:22:16.716355225 0000 testCopy/testFile1.txt
그런 다음 지정한 옵션(아무것도 변경하지 않음)을 사용하여 rsync를 테스트하면 다음이 표시됩니다.
$ rsync -n --update -va test/ testCopy/
sending incremental file list
./
testDir1/
testDir1/testDir11/
testDir2/
왜 이런 일이 발생합니까?
이 --update
옵션이 우선적으로 적용되며 동기화만 수행되므로새로운문서. 복사본에 있는 파일은 원본에 있는 파일보다 최신 버전입니다.
원래 디렉터리에 있는 파일을 터치하면 해당 파일이 포함됩니다.
$ touch test/testFile1.txt
$ rsync -n --update -va test/ testCopy/
sending incremental file list
./
testFile1.txt
testDir1/
testDir1/testDir11/
testDir2/
완전히 동기화된(오래되었거나 최신이지만 다른) 콘텐츠는 다음과 같습니다.
$ rsync -n -va test/ testCopy/
sending incremental file list
./
testFile1.txt
testDir1/
testDir1/testFile2.txt
testDir1/testDir11/
testDir1/testDir11/testFile3.txt
testDir2/
동기화가 허용된 경우(옵션 제거 -n
) 다시 실행합니다.
$ rsync -n -va test/ testCopy/
sending incremental file list
모든 것이 업데이트되었으므로 교환할 필요가 없습니다.
파일이 변경되면(최신 상태로 유지) 업데이트됩니다.
$ touch test/testDir1/testFile2.txt
$ rsync -n --update -va test/ testCopy/
sending incremental file list
testDir1/testFile2.txt
그러나 실제 동기화 후에는 업데이트된 파일이 복사본에 있는 파일인 경우. 그럴 것이다아니요교체가 필요합니다(이미 새 제품임).
$ touch testCopy/testDir1/testFile2.txt
$ rsync -n --update -va test/ testCopy/
sending incremental file list