rsync : 서버에서 대상 디렉토리를 만들도록 어떻게 구성 할 수 있습니까?


144

rsync로컬 컴퓨터에서 서버로 보내고 싶습니다 . 존재하지 않는 rsync디렉토리에서 서버에서 해당 디렉토리를 먼저 작성 하고 싶습니다 .

어떻게해야합니까?

답변:


162

마지막으로 만들려는 리프 디렉토리보다 더 많은 것이 있으면 ssh ... mkdir -p먼저 별도의 명령을 실행 하거나 여기에 설명 된--rsync-path 대로 트릭을 사용할 수 있습니다 .

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/

또는 --relativeTony가 제안한 옵션을 사용하십시오 . 이 경우, 작성 될 소스의 디렉토리 구조가 아니라 존재해야하는 대상의 루트 만 지정하십시오.

rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/

이렇게하면 / pre_existing / dir / new / x / y / z /로 끝납니다.

그리고 "y / z /"를 만들지 만 "new / x /"안에 만들지 않으 ./려면 --relative시작 위치를 추가 할 수 있습니다 .

rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/

/ pre_existing / dir / y / z /를 만듭니다.


2
내가 액세스하는 서버에는이 없으므로 mkdir해킹을 사용하고 --rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \있습니다. 추가 파일을 생성하지만 나중에 제거 할 수 있습니다.
Fabiano Soriani

1
이것은 최신 rsync 프로토콜에서 작동하지 않는 것 같습니다. && 또는;를 사용할 때 다음과 유사한 오류가 발생합니다. --rsync-path 에서 scp 명령의 잘못된 문자! 여기 : & & / usr / bin / rsync
ghitesh

@ghitesh 당신은 탈출하려고 했 &&습니까?
Felipe Alvarez

@FelipeAlvarez 그래,하지만 작동하지 않았다. 지금 링크를 찾을 수 없지만 일부 문서는 이것이 악용 될 수 있다고 생각하여 수정되었다고 말했습니다.
ghitesh

고마워, 이것은 작동합니다. 내 경우에는 원격 서버에서 로컬 bash 스크립트를 실행 중이었고 실행중인 ssh mkdir 명령을 실행했지만 rsync 명령을 실행하기 전에 나머지 스크립트를 종료했습니다. 이를 통해 나머지 스크립트를 문제없이 실행할 수 있습니다.
johndavid400

33

ssh를 사용하여 rsync를 연결한다고 가정하면 ssh 명령을 보내기 전에 다음을 수행하십시오.

ssh user@server mkdir -p existingdir/newdir

이미 존재하면 아무 일도 일어나지 않습니다


4
ufk의 요청은 "rsync가 [&& copy the files] 서버에 [누락 된 대상] 디렉토리를 작성하게하는 구문입니다." 귀하의 응답은 서버에서 누락 된 대상 디렉토리를 생성한다는 점에서 유효합니다. 그러나로 rsync응답하지 않습니다.
TomRoche

이 기능이 지원되지 않는 경우 옵션 ssh이 아니며 원격 쪽에서 rsync연결됩니다 rsync daemon.
Krzysztof Jabłoński

19

-R, --relative옵션은이 작업을 수행 할 것입니다.

예를 들어 /var/named/chroot, 원격 서버에서 동일한 디렉토리 구조 를 백업 하고 작성하려면 -R그렇게하십시오.


12
/./소스 경로를 사용하여 만들 경로의 일부만 지정할 수도 있습니다 . 자세한 내용은 매뉴얼 페이지를 참조하십시오.
Marki555

21
왜 공감해야합니까? 대답은 틀렸고 rsync대상 폴더가 없으면 자동으로 디렉토리를 만들지 않습니다. 한숨.
zeekvfu

3
독자가 맨 페이지를 확인하는 것이 좋습니다 --relative. 당신이 생각하는 것을하지 않을 수도 있습니다.
FiloSottile

3
--relative는 서버가 제공하는 엔드 포인트에서 파일이 아닌 전체 경로를 유지합니다. 일반적으로 /tmp/foo/bar/file.c에서 remote : / tmp는 remote : /tmp/file.c를 생성하지만 -R을 사용하면 /tmp/foo/bar/file.c가 생성됩니다.이 옵션을 사용하지 않으면이 옵션을 사용하지 마십시오. 무엇을하고 있는지 알면 정말 지저분한 디렉토리 구조를 얻게됩니다.
Cormac Mulhall

7
@ Marki555의 의견은 성공의 열쇠입니다. --relative와 함께 /./대부분의 초보자가 찾고있는 것입니다. rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/데스크탑의 내용을 대상 데스크탑으로 복사합니다. 사용자 이름의 차이가 어떻게 영향을 줄 수 있는지 모릅니다.
Daniel F

15

이것은 나를 위해 일했다 :

 rsync /dev/null node:existing-dir/new-dir/

이 메시지가 나타납니다.

skipping non-regular file "null"

그러나 빈 디렉토리가 걸려있는 것에 대해 걱정할 필요가 없습니다.


답변 kdubs에 감사드립니다. 잘 작동했습니다. 따라서 소스로 가리키는 폴더 내에서 동기화하는 파일을 유지하려면 파일을 지정하면됩니다. 예 : rsync -avph / mytest / / otherfolder / mytest / 그런 다음 "작성된 디렉토리 / otherfolder / mytest"
mbrinson

1
new-dir의 끝에서 슬래시 ( '/')를 잊지 마십시오. 그렇지 않으면 디렉토리가 아닌 파일이 생성됩니다.
tartaruga_casco_mole

4

하나의 rsync 명령으로 할 수 있다고 생각하지는 않지만 먼저 다음과 같이 추가 디렉토리를 '사전 생성'할 수 있습니다.

rsync --recursive emptydir/ destination/newdir

여기서 'emptydir'은 로컬 빈 디렉토리입니다 (먼저 임시 디렉토리로 작성해야 할 수도 있음).

그것은 약간의 해킹이지만 나를 위해 작동합니다.

건배

크리스


임시 폴더를 사용할 필요가 없습니다. rsync /dev/null node:existing-dir/new-dir/위의 제안을 참조하십시오 .
lucid_dreamer

3

이 답변은 다른 답변을 사용하지만 상황에 따라 조금 더 명확해질 것입니다. 단일 디렉토리 항목 또는 여러 파일 인 rsyncing 대상을 지정하지 않았습니다.

따라서 소스 디렉토리 항목을 옮기고 그 안에 포함 된 파일을 옮기는 것이 아니라고 가정 해 봅시다.

로컬로 호출 된 디렉토리 data/myappdata/가 있고 그 아래에 많은 서브 디렉토리가 있다고 가정 하십시오. 당신은 data/당신의 목표 머신에 있지만 없습니다 data/myappdata/-이것은 충분히 쉽습니다 :

rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata

원격 디렉토리에 다른 이름을 사용할 수도 있습니다.

rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname

일부 파일 만 이동하고 파일이 포함 된 디렉토리 항목을 이동하지 않는 경우 다음을 수행하십시오.

rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/

myappdata원격 시스템에 파일을 배치 할 디렉토리를 작성합니다 . 다시, data/디렉토리는 원격 시스템에 존재해야합니다.

덧붙여서, 내 -rvv플래그 사용은 이중으로 자세한 출력을 얻는 것이므로 필요한 재귀 적 행동뿐만 아니라 그것이 무엇인지 명확하게 알 수 있습니다.

rsync (Ubuntu 12.04의 3.0.9)를 사용할 때 얻는 것을 보여주기 위해

$ rsync -rvv *.txt user@remote.machine:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
user@remote.machine's password:
sending incremental file list
created directory /tmp/newdir
delta-transmission enabled
bar.txt
foo.txt
total: matches=0  hash_hits=0  false_alarms=0 data=0

희망이 조금 해결되기를 바랍니다.


예상대로 정확하게 작동 하지 않습니다 . 첫 번째 명령을 시도했지만 rsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdata대상에서 작성된 것은 / remote / path / to / data / myappdata / myappdata /
harleygolfguy

첫 번째 명령을 약간 변경하고 소스 경로 뒤에 슬래시 '/'를 추가하면 다음과 같이 작동합니다. rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy

2

예 :

에서 : /xxx/a/b/c/d/e/1.html

: user @ remote : /pre_existing/dir/b/c/d/e/1.html

rsync :

cd / xxx / a / && rsync -auvR b / c / d / e / user @ remote : / pre_existing / dir /

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.