scp 세미콜론이 두 번째 세미콜론을 탈출하지 못했습니다.

scp 세미콜론이 두 번째 세미콜론을 탈출하지 못했습니다.

이 명령이 작동하지 않는 것 같습니다.

scp fx-devel1:/home/user/gege/feed.zip;2 fx-devel2:/home/user/gege/feed.zip;3

나는 시도했다:

scp "fx-devel1:/home/user/gege/feed.zip;\2" "fx-devel2:/home/user/gege/feed.zip\;3"

하지만 다음과 같이 첫 번째 ";"만 이스케이프하는 것 같습니다.

feed.zip;2                                                    100%  302KB 301.8KB/s   00:00
bash: 3: command not found

어떻게 작동하게 합니까? 대상 파일 이름에 ";3"을 포함하고 싶습니다.

편집: 즉흥적으로 작업할 때 작동하게 할 수 있습니다. 전송 후에는 mv를 사용해야 합니다.

scp 'fx-devel1:/home/user/gege/feed.zip\;2' fx-devel2:/home/user/gege/feed.zip

ssh fx-devel2 mv /home/user/gege/feed.zip '/home/user/gege/feed.zip\;3'

그러나 그것은 더 많은 시간을 의미합니다. 수천 개의 파일을 전송하면 서버에 액세스하는 데 걸리는 시간이 거의 두 배로 늘어납니다.

답변1

이것은 나에게 효과적입니다.

/tmp $ ls foo*
'foo;2'
/tmp $ scp 'foo;2' 'localhost:/tmp/foo\;3'
Password:
foo;2                                            100%    0    0.0KB/s    0.0KB/s    00:00
/tmp $ ls foo*
'foo;2'  'foo;3'
/tmp $

답변2

Bash에서는 작은따옴표( ')와 큰따옴표( ")를 모두 사용하여 세미콜론을 인용할 수 있습니다. 인용 문자열을 인용하기 위해 추가 백슬래시를 추가할 필요가 없습니다. 큰따옴표 안에 일부 특수 문자를 인용하려면 백슬래시가 필요하지만 세미콜론은 그 중 하나가 아닙니다( "그렇습니다 \).

Command not found테스트 후 메시지가 원격 시스템에서 왔다는 결론을 내렸습니다 ! 따라서 위의 진술은 사실입니다.적어도 쉘이 포함되는 한은 아닙니다! 그러나 여기서 대상 파일 이름은 어떻게든 반대편의 셸로 전달되는 것 같습니다.

따라서 파일이 호출되어 다른 컴퓨터에 /home/user/gege/feed.zip;2저장되어야 하는 경우 /home/user/gege/feed.zip;3모두 작동해야 합니다.

scp 'fx-devel1:/home/user/gege/feed.zip;2' 'fx-devel2:/home/user/gege/feed.zip\;3'
scp "fx-devel1:/home/user/gege/feed.zip;2" "fx-devel2:/home/user/gege/feed.zip\\;3"
scp fx-devel1:/home/user/gege/feed.zip\;2 fx-devel2:/home/user/gege/feed.zip\\\;3

다음 함수를 사용하여 몇 가지 테스트를 수행하여 쉘에서 인용이 어떻게 작동하는지 확인할 수 있습니다(분명히 매뉴얼 페이지의 관련 부분을 읽으십시오).

test_quoting () {
  printf 'Number of args: %s\n' "$#"
  printf 'First arg: %s\n' "$1"
}
test_quoting abc def
test_quoting "abc def"
test_quoting 'xyz;123'
test_quoting foo\;bar
test_quoting 'foo\;bar'
# and so on

관련 정보