セキュアコピー(scp)を使用してファイルをコピーしようとしています。次のコマンドを実行しようとしていますが、ディレクトリの場所の絶対パスにスペースがあるため、エラーが発生します。
scp -r -P 8484 [email protected]:/media/New Volume/lj /home/pratheep
次のエラーが発生します。
scp: /media/New: No such file or directory
scp: Volume/lj: No such file or directory
次のコマンドを使用してバックスラッシュを追加してみました。
scp -r -P 8484 [email protected]:/media/New\ Volume/lj /home/pratheep
しかし、まだ同じエラーが発生します。
誰かがそれを修正する方法を教えてもらえますか?
答え1
ファイル名を2回引用する必要があります。一度はローカルシェル、一度はリモートシェルです。最も簡単な場合は、次のいずれかを実行できます。
scp -r -P 8484 [email protected]:"'/media/New Volume/lj'" /home/pratheep
scp -r -P 8484 [email protected]:'"/media/New Volume/lj"' /home/pratheep
またはタブ補完機能の使用に役立ちます
scp -r -P 8484 [email protected]:/media/New\\\ Volume/lj /home/pratheep
答え2
scp
rsync
リモートファイル名をリモートシェルに渡します。これにより、次のようなパターンを渡すことができます。
scp remotehost:'*.txt' .
ただし、リモートファイル名を提供するときに追加の引用符が必要な不快な結果があります。
-s
このオプションを渡すと、rsync
リモートシェルでファイル名が拡張されないように保護できます。しかし、これはrsyncの組み込みのワイルドカード拡張を有効にするので、まだ\[?*
。
解決策はアーカイブを転送することです。
ssh -P 8484 [email protected] 'cd "/media/New Volume" && tar cf - lj' |
tar xf - -C /home/pratheep
別のアプローチは、リモートファイルシステムをマウントし、通常のツールを使用してコピーを実行することです。
mkdir mnt
sshfs -p 8484 [email protected]:/ mnt
cp -Rp 'mnt/media/New Volume/lj' /home/pratheep
fusermount -u mnt
rmdir mnt
答え3
Bashスクリプトを使用してスペースを含むリモートパスからファイルをコピーしようとしたときにscp
同様の問題が発生しました。
私が思いついた解決策は次のとおりです。
手動出口パス:
scp user@host:'dir\ with\ spaces/file\ with\ spaces' <destination>
scp user@host:"dir\\ with\\ spaces/file\\ with\\ spaces" <destination>
scp user@host:dir\\\ with\\\ spaces/file\\\ with\\\ spaces <destination>
注:オプションは必須ではありません-T
(下記参照)。
二重引用符+オプションを使用してください-T
。
scp -T user@host:"'<path-with-spaces>'" <destination>
scp -T user@host:'"<path-with-spaces>"' <destination>
scp -T user@host:"\"<path-with-spaces>\"" <destination>
注:オプションがない場合、-T
これらのコマンドはprotocol error: filename does not match request
理由を詳しく説明します。ここ。
printfのエスケープパスを使用してください。
source="<path-with-spaces>"
printf -v source "%q" "${source}"
scp user@host:"${source}" <destination>
注:このオプションはオプションなしでうまく機能します-T
が、単一のファイルに対してのみ機能します。複数のファイルの場合は、-T
オプションが必要です(上記と同じエラー)。