Linux初心者です。リモートシステムからローカルシステムにファイルをコピーしたいのですが、現在Linuxシステムでscpコマンドを使用しています。現在、linuxシステムでscpコマンドを使用していますが、フォルダやファイル名にスペースが含まれているものがあり、そのファイルをコピーしようとするとエラーメッセージが表示されます: "No such file or directory"
私が試したのは
scp [email protected]:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/
ネットでいくつかの参考資料を見ましたが、完全には理解できません、誰か助けてくれませんか?
コピー中にファイル名やディレクトリ名のスペースをエスケープするにはどうすればいいのでしょうか?
基本的には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 .
作品
scp localhost:"f/a\ b\ c" .
scp localhost:'f/a\ b\ c' .
動作しません
scp localhost:'f/a b c' .
その理由は、パスが scp コマンドに渡される前に、文字列がシェルによって解釈されるからです。 そのため、リモートに到達したときに、リモートはエスケープされていない引用符付きの文字列を探してしまい、失敗してしまいます
この現象を確認するには、-vx オプションを指定してシェルを起動してください。
空白のファイル名を含むシェル変数でこれを機能させることは非常に困難でした。 何らかの理由で使用しています。
file="foo bar/baz"
scp [email protected]:"'$file'"
@Adrianのように、答えは失敗するようです。
次のように、へのパラメーター拡張を使用してバックスラッシュを空白にプリペンドすると最も効果的に機能することがわかります。
file="foo bar/baz"
file="${file//\ /\\\ }"
scp [email protected]:"$file"
このLinuxの質問を使用してWindows 10のPowershellにこのヒントを記載して申し訳ありません。この場合、バックスラッシュでエスケープしたり、引用符で囲んだりするスペースチャーは、私には機能しませんでした。 効率的ではありませんが、「?「代わりにchar:
ファイル「tasks.txt Jun-22.bkp」については、「tasks.txt?Jun-22.bkp」。