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
:zsh
ksh
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'