rsync 테스트 실행이 일부 디렉터리를 나열하지만 다른 디렉터리는 나열하지 않는 이유는 무엇입니까?

rsync 테스트 실행이 일부 디렉터리를 나열하지만 다른 디렉터리는 나열하지 않는 이유는 무엇입니까?

출력을 이해하려고 노력 중입니다 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

요점:

  1. 복사(명령 cp)는 rsync와 다른 작업을 수행합니다. 우선, 타임스탬프를 복사하지 않습니다.

  2. 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

관련 정보