web-dev-qa-db-ja.com

セミコロンが2番目のセミコロンをエスケープできない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'

しかし、それはもっと多くの時間を意味します。何千ものファイルを転送する場合、サーバーへのアクセスにかかる時間はほぼ2倍になる可能性があります。

6
InnZaayynn

これは私のために働いた:

/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 $
1
Andy Dalton

Bashでは、シングル(')およびダブル(")の引用符を使用して、セミコロンを引用できます。これらを引用するために、引用符で囲まれた文字列内に余分な円記号を入れる必要はありません。二重引用符で囲む特別な文字を引用するには円記号が必要ですが、セミコロンはその1つではありません(たとえば、"\はそうです)。

テストの結果、Command not foundメッセージはリモートマシンから送信されたものであると結論付けました。したがって、上記は当てはまります少なくとも1つのシェルが関係している限りは!しかし、ここでは、宛先ファイル名が何らかの形で反対側のシェルに渡されているようです。

したがって、ファイルの名前が/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

この関数を使用して、シェルでの引用がどのように機能するかをテストすることができます(そして明らかにmanページの関連部分を読んでください)。

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
0
Lucas