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

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

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

로컬 디렉토리는

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



답변

시험

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

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


답변

시험

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에 의해 원격 호스트에서 확장됩니다. […]


답변

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

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

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

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


답변

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

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

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'" .)


답변

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

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*" .
    

답변

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

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


답변

로부터 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