많은 하위 디렉터리가 있는 두 개의 디렉터리가 있습니다. 디렉터리를 비교하고 두 번째 디렉터리에서 누락된 하위 디렉터리와 첫 번째 디렉터리에서 최신 하위 디렉터리를 찾고 싶습니다. 방법을 찾기 위해 테스트 디렉터리를 만들었습니다. 첫 번째는 다음과 같습니다.
name@pc:~/test> ls -l dir1/
insgesamt 28
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir1
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir2
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir3
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir4
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir5
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir6
drwxrws--- 2 name 1111111 4096 12. Jan 11:35 testdir7
두 번째는 다음과 같습니다.
name@pc:~/test> ls -l dir2/
insgesamt 20
drwxrws--- 2 name 1111111 4096 12. Jan 11:19 testdir1
drwxrws--- 2 name 1111111 4096 12. Jan 11:19 testdir2
drwxrws--- 2 name 1111111 4096 12. Jan 11:19 testdir3
drwxrws--- 2 name 1111111 4096 12. Jan 11:19 testdir4
drwxrws--- 2 name 1111111 4096 12. Jan 10:53 testdir7
보시다시피 testdir5 및 testdir6은 두 번째 디렉터리에 없으며 testdir7은 최신 상태가 아닙니다(첫 번째 디렉터리에 있는 것보다 오래되었습니다). 이 3개의 디렉터리(testdir5, testdir6 및 testdir7)가 원하는 출력입니다. 또한 하위 디렉터리에는 변환 프로세스 전후에 있으므로 두 디렉터리에 동일한 파일/콘텐츠가 포함되어 있지 않습니다. 그래서 rsync에서 -r 옵션을 사용하는 것은 적용되지 않는다고 생각합니다. 다음 명령은 디렉터리 차이점(누락 또는 오래된)을 제공해야 합니다.
name@pc:~/test> rsync --update -dvn dir1/ dir2/
building file list ... done
testdir5/
testdir6/
sent 164 bytes received 18 bytes 364.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
-d 디렉토리 옵션. -v 목록 출력용. -n 차이점에만 관심이 있기 때문입니다. 어쨌든 --update 옵션은 아무런 차이가 없습니다. 여기서 testdir7/을 얻지 못하는 이유는 무엇입니까? 분명히 디렉토리 수정 날짜는 그것이 더 오래되었음을 보여줍니다. 나는 이것이 rsync가 뭔가 다른지 결정하는 방식과 이것이 단지 디렉토리라는 사실과 관련이 있다고 생각합니다. 그러나 내가 아는 한 "수정 시간만 사용" 옵션은 없습니다. 여기서 어떻게 다르게 해야 합니까?
편집: 일부 답변을 테스트한 후의 결과
name@pc:~/test> rsync -dnvt dir1/ dir2/
building file list ... done
./
testdir1/
testdir2/
testdir3/
testdir4/
testdir5/
testdir6/
testdir7/
testdir8/
sent 206 bytes received 43 bytes 498.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
name@pc:~/test> rsync -dnvt --ignore-existing dir1/ dir2/
building file list ... done
./
testdir1/
testdir2/
testdir3/
testdir4/
testdir5/
testdir6/
testdir7/
testdir8/
sent 206 bytes received 43 bytes 498.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
name@pc:~/test> rsync -dnvt --update dir1/ dir2/
building file list ... done
./
testdir1/
testdir2/
testdir3/
testdir4/
testdir5/
testdir6/
testdir7/
testdir8/
sent 206 bytes received 43 bytes 498.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
name@pc:~/test> rsync -anv --ignore-existing dir1/ dir2
sending incremental file list
./
testdir1/
testdir2/
testdir3/
testdir4/
testdir5/
testdir6/
testdir7/
testdir7/testfile1.txt
testdir8/
sent 300 bytes received 54 bytes 708.00 bytes/sec
total size is 9 speedup is 0.03 (DRY RUN)
답변1
rsync에게 디렉터리를 탐색하도록 요청하는 것이 아니므로 디렉터리 내의 파일이 아닌 디렉터리 자체를 동기화할 뿐입니다. rsync가 디렉터리 내의 파일을 고려하도록 하려면 또는 옵션을 전달 -r
하거나 -a
명령줄에 파일을 나열해야 합니다.
rsync에 메타데이터 복사를 요청하지 않았습니다. 기본적으로 rsync는 콘텐츠만 복사합니다. 디렉터리에는 콘텐츠가 없고 디렉터리 자체만 존재합니다. 디렉터리의 콘텐츠(그 안의 파일)는 독립적으로 복사할 수 있고 필터의 영향을 받을 수 있는 별도의 개체로 처리됩니다. 대상 트리에 이미 존재 하므로 testdir7
이에 대해 아무 작업도 수행할 필요가 없습니다. 디렉터리의 타임스탬프를 복사하려면 -t
또는 옵션을 전달해야 합니다 -a
.
디렉터리 내의 파일을 복사하지 않고 디렉터리의 타임스탬프를 복사하는 것은 거의 유용하지 않습니다. 디렉터리에 파일을 생성(또는 삭제 등)하면 해당 디렉터리의 수정 시간이 업데이트됩니다. 반면, 기존 파일을 수정하거나 디렉터리를 변경해도 디렉터리의 수정 시간은 업데이트되지 않습니다. 업데이트 dir2/testdir7
수정 시간과그 다음에dir1/testdir7
에서 로 파일을 복사하면 dir2/testdir7
의 수정 시간은 dir2/testdir7
파일이 복사된 시간이 됩니다. Rsync는 디렉터리의 타임스탬프를 기반으로 디렉터리의 콘텐츠를 복사하기로 결정하지 않습니다. 이는 디렉터리 콘텐츠의 상태에 대한 정보를 제공하지 않기 때문입니다.
답변2
또한 다음을 지정해야 합니다 -t
.
--times, -t preserve modification times
그래서 이것은 작동합니다 :
rsync -dvnt dir1/ dir2/