디렉토리 이름에 공백이있을 때 SSH를 통해 재 동기화하는 방법


71

한 서버에서 다른 서버로 재 동기화하려고합니다. 서버의 디렉토리 구조는 동일하지만 공간이 있으면 원격 서버에서 원격의 경로 이름을 올바르게 인식하지 못하는 데 어려움이 있습니다.

자세한 내용은 다음과 같습니다

로컬 디렉토리는

mnt/xlses/split/v2/name with space

원격 디렉토리는

mnt/xlses/split/v2/name with space

최신 시도를 찾을 수있는 모든 것을 시도했습니다.

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/"name with space"

그것이 첫 번째로 실행되면 새로운 디렉토리를 생성한다는 것입니다.

나는 그것을 중단하고 새로운 디렉토리가 있음을 본다.

mnt/xlses/split/v2/name

모든 파일이 해당 디렉토리에 있습니다.

나는 그들이있을 것으로 기대했다

mnt/xlses/split/v2/name with space

답변:


8

시험

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/mnt/xlses/split/v2/

/소스 디렉토리 경로에서 슬래시를 제거했습니다. 그러면 rsync디렉토리와 그 내용이 모두 복사되므로 rsync원격 호스트에서 이름을 올바르게 입력하지 않아도됩니다.


9
이것은 나를 위해 작동하지 않았지만 johnLate의 답변이 그랬습니다.
Adriaan Tijsseling

이것은 원격 공간을 처리하는 방법을 설명하지 않습니다.
ckujau

언급 한대로 작동하지 않습니다.
Lizardx

128

시험

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "root@myserver.com:/mnt/xlses/split/v2/name with space"

보낸 사람 man rsync:

-s, --protect-args

이 옵션은 모든 파일 이름과 대부분의 옵션을 원격 쉘이 해석하지 않고 원격 rsync로 보냅니다. 즉, 공백은 이름으로 분할되지 않으며 와일드 카드가 아닌 특수 문자는 변환되지 않습니다 (예 : ~, $,;, & 등). 와일드 카드는 쉘 대신 rsync에 의해 원격 호스트에서 확장됩니다. [...]


13
Mac에서는 작동하지 않습니다.
매트 알렉산더

8
home-brew를 사용하여 최신 버전의 rsync를 설치하면 Mac에서 작동합니다.
Adriaan Tijsseling

4
"--protect"를 실행 man rsync하고 ( /s)를 검색 하여 사용중인 rsync 버전인지 확인하십시오 . homebrew와 함께 설치하려면 : brew install homebrew/dupes/rsync찾을 수 없으면을 실행하십시오 brew search rsync.
MikeiLL 2016 년

12
새로운 버전의 설치가 필요하지 않습니다, 당신은 단지 공간을 탈출 호스트 / 파일 이름 인용 - 예rsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo

이것이 정답입니다.
Josh M.

38

이것은 bash에서 작동합니다 : 백 슬래시로 공백을 탈출 한 다음 따옴표를 사용하십시오.

rsync -avuz me@some.server.com:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

또는 변수 $ remote_path에 경로가 있으면 공백을 대체하여 이스케이프 할 수 있습니다.

rsync -avuz me@some.server.com:"${remote_path// /\\ }" .

1
그것은 나를 위해 일했다. Mac 서버에서 작업하지 않아도됩니다.
George

1
정답으로 표시해야합니다. 열쇠는 백 슬래시와 따옴표가 모두 필요하다는 것입니다.
Sridhar Sarnobat

4
이중 이스케이프는 고통 스럽습니다.이 -s옵션은 최신 버전의 rsync
Mark K Cowan

참고 : 경로가 공백 인 원격 서버에서 공백이있는 로컬 경로로 복사 하는 경우 원격 경로에 따옴표 추가 하면 됩니다 .
lenooh

@teekarna의 솔루션이 나를 위해 일했습니다. "rsync"매뉴얼 페이지에 따르면, "--protect-args"또는 "-s"를 사용하는 것도 대안입니다.
Kishan Parekh

14

두 쌍의 따옴표를 사용하십시오

모든 백 슬래시를 신경 쓰지 말고 큰 따옴표 안에 작은 따옴표를 사용하십시오 .

ssh me@myserver.com:"'/home/me/test file'" .

작은 따옴표 안에 큰 따옴표를 역순으로 사용할 수도 있습니다 .

ssh me@myserver.com:'"/home/me/test file"' .

추가 정보

서버 측 와일드 카드

당신이 원하는 경우 *서버가 아닌 클라이언트에서 해석의는 *내부 따옴표의 이쌍 하나를 제공해야합니다. 논리적으로 외부 따옴표 쌍이 클라이언트 해석을 이스케이프하고 내부 따옴표 쌍이 서버 해석을 이스케이프하기 때문에이 반 직관적 인 것을 알 수 있습니다.

Args 보호

장점은 비교 --protect-args솔루션 , 실제로의 제한이 없다는 것입니다 --protect-args, 그래서 당신과 같은 특수 문자를 사용할 수 있습니다 ~또는$ . 그래서 당신은 쓸 수 있습니다 :

rsync host:'"$HOME/test file"' .

또는

rsync host:'~"/test file"' .

~후자의 예제에서 물결표 ( ) 는 큰 따옴표 외부에 있어야합니다.

(예를 파일 부분 : 당신은 전체 사용자 이름 @ 호스트 따옴표 쌍 중 하나를 넣을 수 있습니다 ssh "me@myserver.com:'/home/me/test file'" .)


실제로 호스트 부분을 따옴표로 묶지 않는다는 귀하의 제안은 더 통찰력이 있으므로 게시물의 첫 번째 줄을 만들고 싶어합니다.
Sridhar Sarnobat

2
이 솔루션은 훌륭합니다! ssh를 통한 rsync로 주석에 있던 것처럼 작동했습니다.
Ikon

당신이 그것에 대해 생각할 때, 두 쌍의 따옴표는 완전히 논리적입니다 : 따옴표의 바깥 쪽 쌍은 클라이언트가 그것을 불가분하게 (서버의 내용이 그대로 전달됨) 처리하고 내부의 따옴표 쌍은 서버에 대한 것입니다 불가분성을 인식합니다.
Sridhar Sarnobat

이 답변은 과소 평가되었습니다.
Derple

6

나는 이것이 오래된 질문이라는 것을 알고 있지만 기존 지식에 추가 할 것이라고 생각했습니다.

rsync공간이있는 여러 폴더와 함께 사용 했으며 이것이 작동합니다. 다음과 같이 1-10 사이의 폴더 번호가 있습니다.

  • The\ Folder1
  • The\ Folder2
  • The\ Folder3
  • ..
  • The\ Folder10

사용하려는 두 인스턴스 rsync는 로컬 및 원격입니다.

  1. 로컬 -따옴표가 없습니다.

    rsync -avu /media/data/The\ Folder* .
    
  2. 원격 -따옴표가 있음에 유의하십시오.

    rsync -avu -e ssh you@domain.com:"/media/data/The\ Folder*" .
    

3

일반적으로 말하면 인수를 인용하고 인수에서 공백 문자를 이스케이프 처리하십시오. 제시 한 예에서 다음을 시도하십시오.

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "root@myserver.com:/mnt/xlses/split/v2/name\ with\ space"

1

로부터 rsync맨 :

   If you need to transfer a filename  that  contains  whitespace,  you  can
   either  specify  the --protect-args (-s) option, or you'll need to escape
   the whitespace in a way that  the  remote  shell  will  understand.   For
   instance:

          rsync -av host:'file\ name\ with\ spaces' /dest

0

다른 사람이 더 잘 설명 할 수는 있지만이 질문에 스스로 대답 할 것입니다.

분명히 대상 컴퓨터의 설정은 인수의 구문 분석 방법에 영향을 미치며 공백을 이스케이프하기 위해 따옴표 또는 슬래시를 사용하는 것이 어려워 지지만 와일드 카드를 사용할 수 있도록 설정해야합니다.

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/name*

여러 디렉토리가있는 경우 이름으로 시작하는 디렉토리가 하나만 있기 때문에 이것은 작동 하지 않습니다.

궁극적으로 경로 이름을보다 효율적으로 구문 분석 할 수 있도록 원격 서버를 설정하는 방법을 이해해야합니다. 디렉토리 이름에는 공백을 사용하지 않지만이를 설정 한 사람은 적어도 지금은 붙어 있습니다.


첫 번째 (성공하지 않은) 시도 중에 대상 디렉토리를 이미 생성 했으므로 제안서 만 작동합니다. 더 쉬운 방법은 내 대답을 참조하십시오 (실패한 첫 번째 시도에 의존하지 않는 이점도 있습니다).
dg99

실제로 디렉토리는 이미 존재합니다. 당신은 디렉토리 만들어 내 실패한 시도가 정확하지 않는 / ~ / 이름 없는 공간이 / ~ / 이름 I 삭제 / ~ / 이름 과 디렉토리 다양한 옵션 오려고 공간 / ~ / 이름은 내가 파일을 추가하려고했던 이미 존재를 그것으로
PyNEwbie

아 무슨 말인지 알 겠어
dg99

호스트 / 경로를 인용하고 공백을 이스케이프 처리하면 작동합니다.
ocodo

0

상황에 따라 빠른 옵션은 원격 시스템에서 심볼릭 링크를 만드는 것입니다.

user@remote$ ln -s ~/name\ with\ space/ ~/name_with_space

그런 다음 디렉토리 내용을 따르도록 지시 하는 -L플래그를 사용하십시오 rsync.

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space

나는 생각하기 때문에 심볼릭 링크가 불쾌한 이름 지정이나 불필요하게 복잡한 계층 구조를 우회하는 경우가 있습니다.
Sridhar Sarnobat

0
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ root@myserver.com:/mnt/xlses/split/v2/name\\\ with\\\ space

이중 탈출도 작동합니다


-1

이 방법으로 시도하십시오 :

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.