로컬 파일 구조가 있습니다.
/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