web-dev-qa-db-ja.com

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

私はLinuxに慣れていない、私はリモートからローカルシステムにファイルをコピーしたいのですが...今私はLinuxシステムでscpコマンドを使用しています。ファイル、それはエラーメッセージが表示されます: "そのようなファイルやディレクトリがありません"

私は試した:

scp [email protected]:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/

私はオンラインでいくつかの参考文献を見ました、しかし、私は完全には理解していません、誰かがこれの上で助けることができますか?

コピー中にファイル名またはディレクトリ名のスペースをエスケープする方法.

257
AlexPandiyan

基本的には2回エスケープする必要があります。これはローカルにエスケープされてからリモートエンドにエスケープされるためです。

(bashで)できることがいくつかあります。

scp [email protected]:"'web/tmp/Master File 18 10 13.xls'" .
scp [email protected]:"web/tmp/Master\ File\ 18\ 10\ 13.xls" .
scp [email protected]:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls .
410
Adrian Gunawan

作品

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

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

動作しません

scp localhost:'f/a b c' .

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

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

64
Vorsprung

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

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

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

26
MattK

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

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

リモートディレクトリdirectory with spacesからDownloadsfileディレクトリにコピーする必要があります。

6
Chris

空白を含むファイル名を含むシェル変数に対してこれを機能させるのは非常に困難でした。それを使用していることが判明

file="foo bar/baz"
scp [email protected]:"'$file'"

@ Adrianの答えのように失敗するようです(シェルがこの文字列をどう解釈するかを見るために上記のコマンドの前にset -xを入力してください。

次に示すように、最も効果的なのは、パラメータの展開をにしてバックスラッシュを空白に追加することです。

file="foo bar/baz" # a file inside a directory-name with whitespace
file="${file//\ /\\\ }" # the `//` replaces all instances; `/` just replaces the first
scp [email protected]:"$file"
3
Luke Davis

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

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

0
Vitor Pepicon