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

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

한 서버에서 다른 서버로 동기화하려고 합니다. 서버의 디렉토리 구조는 동일하지만 공백이 있으면 원격 서버의 경로 이름을 올바르게 식별할 수 없습니다.

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

로컬 디렉토리는

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/ [email protected]:/mnt/xlses/split/v2/"name with space"

실행될 때 가장 먼저 보고되는 것은 새 디렉터리를 생성한다는 것입니다.

나는 그것을 중단하고 새로운 디렉토리가 있다는 것을 알았습니다

mnt/xlses/split/v2/name

내 모든 파일은 해당 디렉토리에 있습니다

나는 그들이 거기 있을 것이라고 생각했다

mnt/xlses/split/v2/name with space

답변1

노력하다

rsync -s --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/" "[email protected]:/mnt/xlses/split/v2/name with space"

man rsync(2023년 업데이트) 부터 :

--secluded-args,-s

이 옵션은 프로토콜을 통해(원격 셸 명령줄 대신) 모든 파일 이름과 대부분의 옵션을 원격 rsync로 보내 원격 셸이 이를 수정하는 것을 방지합니다. 와일드카드는 셸이 아닌 원격 호스트에서 rsync에 의해 확장됩니다.

[...]

--protect-args이 옵션은 (3.2.6 이전) 호출되었으며 여전히 이전 이름을 사용할 수 있습니다(비록 지정하는 것이 -s항상 가장 쉽고 호환성이 가장 높은 옵션임).

답변2

이는 bash에서 작동합니다. 백슬래시로 공백을 이스케이프 처리한 다음 따옴표를 사용합니다.

rsync -avuz [email protected]:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

또는 $remote_path 변수에 경로가 있는 경우 다음을 바꾸어 공백을 이스케이프할 수 있습니다.

rsync -avuz [email protected]:"${remote_path// /\\ }" .

답변3

두 쌍의 따옴표를 사용하세요.

  1. 모든 백슬래시를 무시하고 그냥 사용하세요.큰따옴표 안의 작은따옴표:

    ssh [email protected]:"'/home/me/test file'" .
    
  2. (권장)은 반대로 사용될 수도 있습니다.작은따옴표 안에 큰따옴표가 있습니다.:

    ssh [email protected]:'"/home/me/test file"' .
    

두 번째 방법은 서버에서 와일드카드를 사용할 수 있기 때문에 더 좋습니다(작은따옴표는 클라이언트에서 확장되지 않기 때문입니다). 동일한 접두사를 가진 여러 파일을 재동기화하는 동안 이 작업을 수행하고 있습니다.


추가 정보

서버측 와일드카드

*클라이언트가 아닌 서버에서 a를 해석 하려면 *두 쌍의 따옴표 중 하나만 안에 표시되어야 합니다. 논리적으로 바깥쪽 쌍의 따옴표는 클라이언트 해석을 벗어나고 안쪽 쌍은 서버 해석을 벗어나기 때문에 이것이 직관에 어긋난다고 생각합니다.

보호 매개변수

그에 비해 장점은--protect-args해결책즉, 실제로는 이 제한이 --protect-args없으므로~또는 등의 특수 문자를 사용할 수 있습니다.$. 따라서 다음과 같이 작성할 수 있습니다.

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

또는

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

후자의 예에서 물결표( ~) 는 다음과 같아야 합니다.외부큰따옴표.

전체 username@host:file 부분에 따옴표 쌍을 넣을 수 있습니다(예:)ssh "[email protected]:'/home/me/test file'" .

답변4

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

공백이 있는 여러 폴더를 사용했는데 rsync이것이 작동합니다. 다음과 같이 1-10번 폴더가 있습니다.

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

사용하려는 2개의 인스턴스는 rsync로컬 인스턴스와 원격 인스턴스입니다.

  1. 현지의- 누락된 따옴표를 참고하세요.

    rsync -avu /media/data/The\ Folder* .
    
  2. 외딴- 따옴표가 있는지 확인하세요.

    rsync -avu -e ssh [email protected]:"/media/data/The\ Folder*" .
    

관련 정보