web-dev-qa-db-ja.com

スペースを含むSSHパスを介したRsyncが引用符で機能しない

パスにスペースが含まれていない限り、SSHでRSYNCを正常に実行できます。

パスにスペースが含まれている場合、機能しません。スラッシュ、引用符、二重引用符を試しました。

スラッシュを使用すると、出力に成功と表示されますが、転送されたファイルは表示されません。

rsync -avz /path\ with\ spaces/ user@remotelocation:/media/another\ path\ with/spaces/

一重引用符または二重引用符を使用すると、パスワードを入力した後、許可が拒否されることがわかります

rsync -avz '/path with spaces/' 'user@remotelocation:/media/another path with/spaces/'

私に何ができる?

ありがとうございました。

15
AndrewMRiv

サンプルコードとリファレンスを使用してrzrの答えを拡張し、-sフラグを追加してパスを引用するだけで、リモートパスのスペースをエスケープする心配はありません。

rsync -avzs '/path with spaces/' 'user@remotelocation:/media/another path with/spaces/'

参照用に、OPで指定されたオプション:

  • -a、アーカイブモード、-rlptgoDと等しい(-H、-A、-Xなし)
    • 含まれるもの:
    • -r、-再帰、ディレクトリへの再帰
    • -l、-links、シンボリックリンクをシンボリックリンクとしてコピー
    • -p、-perms、アクセス許可を保持
    • -t、-times、変更時間を保存
    • -g、-group、グループを保持
    • -o、-owner、所有者を保持(スーパーユーザーのみ)
    • -devices、デバイスファイルの保持(スーパーユーザーのみ)
    • -specials、特殊ファイルを保持
  • -v、-verbose、詳細度を上げる
  • -z、-compress、転送中のファイルデータの圧縮

必要な追加パラメーター:

  • -s、-protect-args、スペース分割なし、ワイルドカード文字のみ
10
binarysubstrate

ローカルシェルとリモートシェルの両方でスペースをエスケープする必要があります。これを試して:

rsync -avz '/path with spaces/' 'user@remotelocation:/media/another\ path\ with/spaces/'

ソース、ローカルシェルの/path with spaces/は、単一引用符で囲むことによってのみエスケープできます。つまり、'/path with spaces/'です。

一方、宛先の場合、ローカルシェルは単一引用符を使用してエスケープされ、スペースはスペースの前にエスケープ文字(\)を使用してリモートシェルでエスケープされます。

13
heemayl

rsyncオプション–protect-args(-s)を見てください。余分なスラッシュは不要です

1
rzr