scpセミコロンは2番目のセミコロンを脱出できませんでした。

scpセミコロンは2番目のセミコロンを脱出できませんでした。

このコマンドが機能していないようです。

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倍になります。

答え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では、単一引用符(')と二重引用符(")の両方を使用してセミコロンを引用できます。引用符付き文字列を引用するために余分なバックスラッシュを追加する必要はありません。二重引用符で特殊文字を引用するにはバックスラッシュが必要ですが、セミコロンはそのうちの1つではありません("はい\)。

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

関連情報