고쳐 쓰다:

고쳐 쓰다:

rsync를 사용하여 파일을 원격 위치로 이동하려고 합니다.

파일 이름은 DRRS_(H264).mp4입니다.

하지만 내가 시도할 때:

rsync -azR output.mp4 [email protected]:encoded/somepath/DRRS_(H264).mp4

bash: 예상치 못한 표시 '(' 근처에서 구문 오류가 발생했습니다.

하지만 어떻게 캡슐화해야 하는지 이해가 되지 않습니다.

나는 시도했다:

rsync -azR output.mp4 [email protected]:"encoded/somepath/DRRS_(H264).mp4"

그리고

rsync -azR output.mp4 "[email protected]:encoded/somepath/DRRS_(H264).mp4"

성공하지 못했습니다.

답변1

-s|--protect-args이 옵션을 사용하고 싶습니다 rsync.

이것이 없으면 다음 부분이 :있는 그대로 원격 셸에 전달되므로 해당 셸의 생성자를 사용하여 전송할 목록을 작성할 수 있습니다.

이렇게 하면 원격 셸이 zsh라는 것을 알고 있으면 다음을 수행할 수 있습니다.

rsync host:'*(.)' there

일반 파일만 전송됩니다. 또는 csh///를 사용하세요 bash:zshksh

rsync host:'{foo,bar}.txt' there

또는:

rsync file 'host:"$HOME/$(uname)-file"'

이제 이는 임의의 이름을 가진 파일을 쉽게 전송할 수 없음을 의미합니다.

를 사용하면 -s문자열 rsync이 원격 셸로 전달되지 않습니다. 대신, 원격 호스트의 서버에 대역 내로 전달하므로 rsync원격 쉘이 이를 해석하지 않습니다.

(대부분의 쉘에는 특별하게 ), 각 쉘마다 다른 원격 쉘의 구문을 사용하여 이스케이프해야 합니다.

대신 사용하는 것이 좋습니다 -s.

rsync -sazR output.mp4 [email protected]:'encoded/somepath/DRRS_(H264).mp4'

그러나 rsync(자신의) 와일드카드는 전달한 문자열에 대해 여전히 수행됩니다(대상에 대해서도!). 따라서 여전히 할 수 없습니다 rsync. example이라는 파일을 처리하려면 *백슬래시를 사용하여 이스케이프해야 합니다(적어도 이번에는 원격 쉘과 관련이 없습니다).

rsync -sazR output.mp4 [email protected]:'\*'

따라서 이름이 포함된 파일을 전송하려면 다음을 $1사용해야 합니다.

file=$1
rsync_escaped_file=$(
  printf '%s.\n' "$file" | sed 's/[[*?]/\\&/g'
)
rsync_escaped_file=${rsync_escaped_file%.}
rsync -s ... "user@host:$rsync_escaped_file"

로컬 쉘이 이고 bash원격 사용자의 로그인 쉘이 bash동일한 버전 이라는 것을 알고 있는 경우 printf %q대신 원격 쉘 특정 문자를 이스케이프하는 것을 사용할 수 있습니다 -s.

LC_ALL=C printf -v shell_escaped_file %q "$1"
rsync ... "user@host:$shell_escaped_file"

원격 호스트의 로그인 셸이 Bourne과 유사하고(Bourne, ksh, yash, zsh, bash, ash...) SSH 클라이언트와 서버가 환경 변수 전달을 허용한다는 것을 알고 있는 경우에도LC_* 이 작업을 수행할 수 있습니다(다시 말하지만, 를 사용하지 않음 -s). :

LC_FILE=$1 rsync ... 'user@host:"$LC_FILE"'

참고 1: -s| --protect-args이 옵션은 버전 3.0.0(2008) 이상에서만 사용할 수 있습니다.

노트 2: rsync문서에서는 -s| --protect-args향후 버전에서 기본값이 될 수 있다고 경고합니다 rsync(향후 보장을 위해 --no-protect-args해당 효과를 원하지 않으면 사용을 시작하는 것이 좋습니다).

답변2

아래의 것을 시도해 보세요. 테스트해 본 결과 작동합니다. '대상 경로를 또는 로 인용 해야 하며 "(이스케이프 되어야 합니다 ).

rsync -azR output.mp4 [email protected]:'encoded/somepath/DRRS_\(H264\).mp4'

고쳐 쓰다:

다음과 같이 스크립트를 호출합니다.

./sample.sh "encoded/somepath/DRRS_\(H264\).mp4"

샘플.sh

 #!/bin/bash
 rsync -azR output.mp4 [email protected]:"$1"

답변3

경로를 인용하고 사용해야합니다백슬래시도망가다괄호원격 경로에서.

작은따옴표나 큰따옴표 모두 괜찮습니다.

rsync -azR output.mp4 [email protected]:"encoded/somepath/DRRS_\(H264\).mp4"

또는

rsync -azR output.mp4 [email protected]:'encoded/somepath/DRRS_\(H264\).mp4'

관련 정보