Isso funcionou para mim:
/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 $
Não consigo fazer esse comando funcionar:
scp fx-devel1:/home/user/gege/feed.zip;2 fx-devel2:/home/user/gege/feed.zip;3
Eu tentei:
scp "fx-devel1:/home/user/gege/feed.zip;" "fx-devel2:/home/user/gege/feed.zip\;3"
ainda parece que só escapa o primeiro ';' como isso aparece:
feed.zip;2 100% 302KB 301.8KB/s 00:00
bash: 3: command not found
Como faço para que funcione? Eu gostaria de incluir o '; 3' no nome do arquivo de destino.
EDITAR: Eu posso fazer isso funcionar quando eu improviso - eu tenho que usar o mv após a transferência:
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'
Mas isso significa muito mais tempo. Ao transferir milhares de arquivos, isso quase dobraria o tempo de acesso aos servidores.
Isso funcionou para mim:
/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 $
No bash single ( '
) e double ( "
) aspas podem ser usadas para citar um ponto e vírgula. Não há necessidade de colocar uma barra invertida extra dentro da string citada para citá-las. Você precisa da barra invertida para citar alguns caracteres especiais dentro de aspas duplas, mas o ponto-e-vírgula não é um deles ( "
e \
, por exemplo, são).
Após um teste, concluo que a mensagem Command not found
vem da máquina remota! Então, o que precede é verdade, pelo menos não enquanto um shell estiver envolvido! Mas aqui o nome do arquivo de destino parece ser passado para o shell do outro lado de alguma forma.
Então, se o seu arquivo é chamado de /home/user/gege/feed.zip;2
e deve ser salvo como /home/user/gege/feed.zip;3
na outra máquina, um deles deve funcionar
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
Você pode fazer alguns testes de como as citações no shell funcionam (e obviamente ler a parte relevante da man page) com esta função:
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