동기화

동기화

로컬 파일 구조가 있습니다.

/tmp/24
    /dir1
        /file1
        /file2
    /dir2
        /file3
        /file4

원격 컴퓨팅에 업로드하고 싶습니다. 내가 사용할 때

rsync /tmp/24 host:/target

원격 호스트( , ...) target의 디렉터리 내부에 생성됩니다 . /target/24/dir1/file1그런데 이렇게 사용하다보니

rsync /tmp/24/ host:/target

내가 원하는 작업을 수행합니다. 즉, 다음과 같이 생성합니다 /target/dir1/file1. 그러나 대상 폴더가 이미 존재하면 경로가 로 끝나는지 여부 scp에 관계없이 첫 번째 항목이 실행되고, 대상 폴더가 존재하지 않으면 두 번째 항목이 실행됩니다 . /두 번째 예처럼 동작하도록 하려면 어떻게 해야 합니까 scp?rsync

답변1

소스 디렉터리 이름 뒤의 "/"는 rsync의 미묘함입니다. 그것에주의를 기울이십시오.

동기화

소스 파일 끝에 있는 슬래시는 실제로 "복사"를 의미합니다.콘텐츠디렉토리 자체가 아닌 해당 디렉토리의 디렉토리입니다." 후행 슬래시가 없으면 "디렉토리 복사"를 의미합니다.

그럼 rsync -a tmp/24/ host:/target복사가 되겠죠콘텐츠"host:/target/…"에 "/tmp/24/"를 씁니다.

하지만 rsync -a tmp/24 host:/target복사할 거예요목차"/tmp/24/"(및 해당 내용)을 "host:/target/24/..."로 변환합니다.

"host:/target/"이 아직 존재하지 않아도 상관없습니다. 필요한 경우 생성되며 결과는 어느 쪽이든 동일합니다.

(대상의 후행 슬래시는 중요하지 않습니다.)

┌─────────────────────────┬───────────────┬───────────────────────┐
│ rsync                   │ target exists │ target does not exist │
├─────────────────────────┼───────────────┼───────────────────────┤
│ rsync -a tmp/24 target  │ target/24/…   │ target/24/…           │
├─────────────────────────┼───────────────┼───────────────────────┤
│ rsync -a tmp/24/ target │ target/…      │ target/…              │
└─────────────────────────┴───────────────┴───────────────────────┘

SCP

슬래시는 전혀 중요하지 않으며 대상 디렉터리가 존재한다는 점만 다릅니다. 소스 디렉터리가 있으면 복사하세요.입력하다대상 디렉터리. 그렇지 않으면 대상 디렉터리가 소스 디렉터리의 복제본으로 생성됩니다.

┌───────────────────────┬───────────────┬───────────────────────┐
│ scp                   │ target exists │ target does not exist │
├───────────────────────┼───────────────┼───────────────────────┤
│ scp -r tmp/24 target  │ target/24/…   │ target/…              │
├───────────────────────┼───────────────┼───────────────────────┤
│ scp -r tmp/24/ target │ target/24/…   │ target/…              │
└───────────────────────┴───────────────┴───────────────────────┘

따라서 당신 말이 맞습니다. 먼저 이 작업을 수행해야 하며 ssh host mkdir -p /target그 다음 동작은 rsync와 동일합니다.

하지만 왜 rsync를 사용하지 않는 걸까요? 부분 전송, 중단 전송, 압축 데이터 등 더 많은 작업을 수행할 수 있습니다.

rsync -azu tmp/24 host:/target

CP

완전성을 위해: Mac에서는 대상이 이미 존재하는 한 후행 "/"가 rsync 의미 체계를 제공합니다.

┌──────────────────────┬───────────────┬───────────────────────┐
│ cp (Mac)             │ target exists │ target does not exist │
├──────────────────────┼───────────────┼───────────────────────┤
│ cp -a tmp/24 target  │ target/24/…   │ target/…              │
├──────────────────────┼───────────────┼───────────────────────┤
│ cp -a tmp/24/ target │ target/…      │ target/…              │
└──────────────────────┴───────────────┴───────────────────────┘

Linux에서는 scp와 마찬가지로 슬래시가 전혀 중요하지 않습니다.

┌──────────────────────┬───────────────┬───────────────────────┐
│ cp (Linux)           │ target exists │ target does not exist │
├──────────────────────┼───────────────┼───────────────────────┤
│ cp -a tmp/24 target  │ target/24/…   │ target/…              │
├──────────────────────┼───────────────┼───────────────────────┤
│ cp -a tmp/24/ target │ target/24/…   │ target/…              │
└──────────────────────┴───────────────┴───────────────────────┘

같은 상기와

추가됨... ditto(1)은 디렉토리 복제를 위한 Mac OS 도구입니다. 최대한 정확하게 복사됩니다.

슬래시는 전혀 중요하지 않습니다. 대상 디렉터리가 이미 존재하는지 여부는 중요하지 않습니다.

┌──────────────────────┬──────────┐
│ ditto tmp/24 target  │ target/… │
└──────────────────────┴──────────┘

대상이 이미 존재하는 경우 기존 파일을 무조건 덮어씁니다. 소스에 없는 파일은 대상에 유지됩니다.

답변2

하하, 내 문제는 다음과 같이 해결될 수 있습니다.

ssh host "mkdir -p /target"
scp tmp/24/* host:/target

관련 정보