Linuxでscpコピーのパスのスペースをエスケープするにはどうすればよいですか?


307

私はLinuxを使い始めたばかりですが、リモートからローカルシステムにファイルをコピーしたいのですが、今ではLinuxシステムでscpコマンドを使用しています。それをコピーしようとすると、いくつかのフォルダまたはファイル名にスペースが含まれていますファイル、それはエラーメッセージを示します:「そのようなファイルまたはディレクトリはありません」

私は試した:

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

オンラインでいくつかのリファレンスを見ましたが、完全には理解できません。

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


動作しません!すでにやります..
AlexPandiyan 2013年

ファイルが実際に存在することを再確認してください。ログイン名とIPアドレスを含むパス全体を引用符で囲みます。または、引用符をリモートにして、代わりにスペースの前にバックスラッシュを付けます。

回答:


491

ローカルでエスケープしてからリモートエンドでエスケープするため、基本的には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 .

11
これはかなりマイナーですが、Macおよびターミナルなどのほとんどのコンソールアプリでは、「エスケープテキストの貼り付け」オプションがあります。したがって、2番目のオプションを使用しました。
Sacrilicious 2014

3
''パス ''は機能しましたが、 ''パス ''は失敗しました。最初に一重引用符、次に二重引用符で囲む

7
うわー!それはおそらく、私が見た中で最もばかげているプログラムの動作です。
ジャンク2018

2
@jankesメリットがないわけではありません。シェルコマンドの引数があるという事実によりscp user@example.com:'$(ls -t | head -1)' .、サーバーで最近作成されたファイルscp user@example.com:'dir/*.{xml,pdf}' .を取得したり、リモートディレクトリからすべてのxmlおよびpdfファイルを取得したりすることができます。一般に、スペースがあるファイルの利便性よりも、この方法を優先します。スペースのあるファイルは常に面倒です。
JoL 2018

1
なぜ2回脱出なの?この動作を変更する方法はありますか?
フラクタル

76

働く

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

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

動作しません

scp localhost:'f/a b c' .

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

この動作を確認するには、-vxオプションを指定してシェルを起動します。つまりbash -vx、実行時にコマンドの補間バージョンが表示されます。


一重引用符を使用してエスケープするとうまく
いき

1
見てみましょう@MauricioTrajano gnu.org/software/bash/manual/html_node/Quoting.htmlすべての引用符が異なることを行います。上記の単純なケースでは、二重"または単一の'作業は同じ
Vorsprung

34

また、あなたは次のようなことをすることができます:

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

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


4
この答えは、同じ量のエスケープ文字で処理できるスペースの数を考慮して、過小評価されています。ありがとう!
マイケル

20

ディレクトリ名のスペースをエスケープするには、3つの円記号を使用します。

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

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


これは私にとってUbuntu 19.10で動作した唯一のものです。二重引用符、内外へのソフトおよびハードの引用符、エスケープされた引用符はありません。トリプルスラッシュスペースのみ。とても変。ありがとうございました!
uldics

9

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

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

@エイドリアンの答えのように失敗するようです。

次のように、パラメータ拡張を使用して、空白の前にバックスラッシュを付加することが最も効果的であることがわかります

file="foo bar/baz"
file="${file//\ /\\\ }"
scp user@example.com:"$file"

:私は、より堅牢な「代用すべての」拡張を示唆している file="${file//\ /\\\ }"
troyfolger

その違いを忘れてしまった-私は自分のパラメーター展開に錆びている。ありがとう!
ルークデイビス

変数はありませんでしたが、これは、スペースの多いパスの3つのバックスラッシュの良い代替手段として満足しました。そのための時間は誰にもありません!
ロバートダンドン2018

1

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

「tasks.txt Jun-22.bkp」ファイルの場合「tasks.txt?Jun-22.bkp」を使用してダウンロードしました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.