web-dev-qa-db-ja.com

スペースを含む安全なコピー(scp)ファイル名の問題

セキュアコピー(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

しかし、それでも同じエラーが発生します。

誰かがそれを修正する方法を教えてもらえますか?

9
pradeepchhetri

ファイル名は、ローカルシェル用とリモートシェル用の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
18
enzotib

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

もう1つの方法は、リモートファイルシステムをマウントしてから、通常のツールを使用してコピーを実行することです。

mkdir mnt
sshfs -p 8484 [email protected]:/ mnt
cp -Rp 'mnt/media/New Volume/lj' /home/pratheep
fusermount -u mnt
rmdir mnt