Linuxでscpコピー時にパスの中のスペースをエスケープするには?

Linux初心者です。リモートシステムからローカルシステムにファイルをコピーしたいのですが、現在Linuxシステムでscpコマンドを使用しています。現在、linuxシステムでscpコマンドを使用していますが、フォルダやファイル名にスペースが含まれているものがあり、そのファイルをコピーしようとするとエラーメッセージが表示されます: "No such file or directory"

私が試したのは

scp ael5105@192.168.0.200:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/

ネットでいくつかの参考資料を見ましたが、完全には理解できません、誰か助けてくれませんか?

コピー中にファイル名やディレクトリ名のスペースをエスケープするにはどうすればいいのでしょうか?

質問へのコメント (2)

基本的には2回エスケープする必要があります。なぜなら、ローカルでエスケープされた後、リモート側でもエスケープされるからです。

bashでは、いくつかのオプションがあります。

scp user@example.com:"'web/tmp/Master File 18 10 13.xls'" .
scp user@example.com:"web/tmp/Master\ File\ 18\ 10\ 13.xls" .
scp user@example.com:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls .
解説 (8)

作品

scp localhost:"f/a\ b\ c" .

scp localhost:'f/a\ b\ c' .

動作しません

scp localhost:'f/a b c' .

その理由は、パスが scp コマンドに渡される前に、文字列がシェルによって解釈されるからです。 そのため、リモートに到達したときに、リモートはエスケープされていない引用符付きの文字列を探してしまい、失敗してしまいます

この現象を確認するには、-vx オプションを指定してシェルを起動してください。

解説 (2)

また、次のようにすることもできます。

scp foo@bar:"\"apath/with spaces in it/\""

最初のレベルの引用符がscpによって解釈され、次に2番目のレベルの引用符がスペースを保持します。

解説 (1)

ディレクトリの名前でスペースをエスケープするには、3つのバックスラッシュを使用します。

scp user @ host:/ path / to / directory \\\ with \\ spaces / file〜/ Downloads

Downloadsディレクトリに filedirectory with spaceと呼ばれるリモートディレクトリからコピーする必要があります。

解説 (0)

空白のファイル名を含むシェル変数でこれを機能させることは非常に困難でした。 何らかの理由で使用しています。

file="foo bar/baz"
scp user@example.com:"'$file'"

@Adrianのように、答えは失敗するようです。

次のように、へのパラメーター拡張を使用してバックスラッシュを空白にプリペンドすると最も効果的に機能することがわかります。

file="foo bar/baz"
file="${file//\ /\\\ }"
scp user@example.com:"$file"
解説 (3)

このLinuxの質問を使用してWindows 10のPowershellにこのヒントを記載して申し訳ありません。この場合、バックスラッシュでエスケープしたり、引用符で囲んだりするスペースチャーは、私には機能しませんでした。 効率的ではありませんが、「?「代わりにchar:

ファイル「tasks.txt Jun-22.bkp」については、「tasks.txt?Jun-22.bkp」。

解説 (0)