ディレクトリ名にスペースが含まれる場合にsshでrsyncを実行する方法


71

あるサーバーから別のサーバーにrsyncしようとしています。サーバーのディレクトリ構造は同じですが、リモートサーバーにスペースがある場合にリモートサーバーでリモートのパス名を適切に認識させることができません。

詳細はこちら

ローカルディレクトリは

mnt/xlses/split/v2/name with space

リモートディレクトリは

mnt/xlses/split/v2/name with space

私は最新の試みが見つけることができるすべてを試しました

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/"name with space"

それが報告する最初のことを実行すると、それは新しいディレクトリを作成しているということです

中断して、新しいディレクトリがあることを確認します

mnt/xlses/split/v2/name

私のファイルはすべてそのディレクトリにあります

私は彼らがいると期待していた

mnt/xlses/split/v2/name with space

回答:


8

試して

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/mnt/xlses/split/v2/

/ソースディレクトリパスから末尾のスラッシュを削除しました。これによりrsync、ディレクトリとそのすべてのコンテンツがコピーさrsyncれます。つまり、リモートホスト(名前は)の代わりに名前が正しくなることを心配します。


9
これは私にはうまくいきませんでしたが、johnLateの答えはうまくいきました。
アドリアーン・タイセリング

これは、リモート側のスペースを処理する方法を説明しません。
ckujau

前述のとおり、これは機能しません。
リザード

128

試して

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "root@myserver.com:/mnt/xlses/split/v2/name with space"

からman rsync

-s、-protect-args

このオプションは、すべてのファイル名とほとんどのオプションをリモートrsyncに送信しますが、リモートシェルはそれらを解釈できません。つまり、スペースは名前に分割されず、非ワイルドカードの特殊文字は変換されません(〜、$、;、&など)。ワイルドカードは、リモートホスト上で(シェルが実行するのではなく)rsyncによって展開されます。[...]


13
これはMacでは機能しません。
マットアレクサンダー

8
home-brewを使用してrsyncの最新バージョンをインストールすると、Macで動作します。
アドリアーン・タイセリング

4
「--protect」を実行man rsyncして検索(/s)することにより、rsyncのバージョンにあるかどうかを確認します。homebrewでインストールするには:brew install homebrew/dupes/rsyncが見つからない場合はを実行しbrew search rsyncます。
MikeiLL

12
新しいバージョンをインストールする必要がないので、あなただけのスペースをエスケープするホスト/ファイル名を引用-例えばrsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo

これは受け入れられた答えであるはずです。
ジョシュM.

39

これはbashで動作します:バックスラッシュでスペースをエスケープしてから引用符を使用します:

rsync -avuz me@some.server.com:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

または、変数$ remote_pathにパスがある場合、置換によりスペースをエスケープできます。

rsync -avuz me@some.server.com:"${remote_path// /\\ }" .

1
それは私のために働いた。Macサーバーで作業する必要がなくなりました。
ジョージ

1
これに正解をマークする必要があります。重要なのは、バックスラッシュと引用符の両方が必要なことです。
シュリダールSarnobat

4
ダブルエスケープは痛みで、-sオプションはrsyncの任意の現代版上で動作し、この問題を解決するために設計されて
マーク・K・コーワン

:パスにスペースを含むリモートサーバーからスペースを含むローカルパスにコピーする場合は、引用符をリモートパスに追加するだけです。
レヌー

@teekarnaからのソリューションが私にとってはうまくいきました。「rsync」のmanページによると、代わりに「--protect-args」または「-s」を使用することもできます。
Kishan Parekh

14

2組の引用符を使用する

すべてのバックスラッシュを気にせず、二重引用符の中に単一引用符を使用するだけです:

ssh me@myserver.com:"'/home/me/test file'" .

逆を使用することもできます。つまり、単一引用符の内側二重引用符を使用します

ssh me@myserver.com:'"/home/me/test file"' .

さらに詳しい情報

サーバー側のワイルドカード

*クライアントではなくサーバー上でを解釈したい場合*、引用符の2つのペアのうちの1つだけの中に入れる必要があります。論理的には、引用符の外側のペアはクライアントの解釈を回避し、内側の引用符のペアはサーバーの解釈を回避するため、この直感に反します。

引数を保護する

--protect-args解決策と比較した場合の利点は、実際にはの制限がない--protect-argsため~またはなどの特殊文字を使用できること$です。だからあなたは書くことができます:

rsync host:'"$HOME/test file"' .

または

rsync host:'~"/test file"' .

~後者の例のチルダ()は、二重引用符の外側にある必要があることに注意してください。

あなたは全体のユーザ名@ホストの前後に引用符のペアのいずれかを置くことができます。ファイルの一部(例えばssh "me@myserver.com:'/home/me/test file'" .


実際、ホスト部分を引用符で囲まないというあなたの提案は、より洞察に富んでいるので、これを投稿の最初の行にするのは魅力的です。
スリダールサルノバト

2
このソリューションは素晴らしいです!sshを介したrsyncを使用して、そのまま動作しました。
イコン

考えてみると、引用符の2つのペアは完全に論理的です。引用符の外側のペアは、クライアントがそれを不可分に処理するためのものであり(その内容はサーバーにそのまま渡されます)、引用符の内側のペアはサーバー用です不可分性を認識するため。
シュリダールSarnobat

この答えは過小評価されています。
ダープル

6

これは古い質問であることは理解していますが、既存の知識体系に追加すると思いました。

rsyncスペースのある複数のフォルダーで使用しましたが、これは機能します。次のように1〜10の番号が付いたフォルダーがあります。

  • The\ Folder1
  • The\ Folder2
  • The\ Folder3
  • ..
  • The\ Folder10

使用する2つのインスタンスrsyncは、ローカルとリモートです。

  1. ローカル -引用符がないことに注意してください。

    rsync -avu /media/data/The\ Folder* .
    
  2. リモート -引用符の存在に注意してください

    rsync -avu -e ssh you@domain.com:"/media/data/The\ Folder*" .
    

3

一般的に、引数を引用し、引数内のスペース文字をエスケープします。あなたが与えた例では、試してみてください:

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "root@myserver.com:/mnt/xlses/split/v2/name\ with\ space"

1

rsyncマンページから:

   If you need to transfer a filename  that  contains  whitespace,  you  can
   either  specify  the --protect-args (-s) option, or you'll need to escape
   the whitespace in a way that  the  remote  shell  will  understand.   For
   instance:

          rsync -av host:'file\ name\ with\ spaces' /dest

0

他の誰かがそれを説明するより良い仕事をするかもしれませんが、私はこの質問に自分で答えるつもりです。

明らかに、宛先マシンのセットアップは引数の解析方法に影響し、引用符やスラッシュを使用してスペースをエスケープするのを困難にするセットアップが必要ですが、ワイルドカードを使用できるのでこれを行いました

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/name*

複数のディレクトリがある場合、名前で始まるディレクトリは1つしか存在しないため、これは機能しません。

最終的に、リモートサーバーがパス名をより効率的に解析できるようにリモートサーバーをセットアップする方法を理解する必要があります-ディレクトリ名にスペースを使用することはありませんが、これを設定した人が使用しました


最初の(失敗した)試行中に既に宛先ディレクトリを作成したため、提案は機能します。より簡単な方法については私の回答を参照してください(失敗した最初の試行に依存しないという利点もあります:)。
dg99

実は、ディレクトリはすでに存在していました。あなたは私の失敗には正しくありません、それはディレクトリを作成しようとする/〜/名前ではないスペースで/〜/名前を私は削除/〜/名前をし、ディレクトリのさまざまなオプションを試し保管スペースと/〜/名前は、私はファイルを追加しようとしていた、すでに存在していましたそれに
PyNEwbie

ああ、私はあなたの意味がわかります。
dg99

ホスト/パスを引用し、スペースをエスケープする場合に機能します。
オコド

0

状況に応じて、簡単なオプションはリモートシステムにシンボリックリンクを作成することです。

user@remote$ ln -s ~/name\ with\ space/ ~/name_with_space

次に、ディレクトリの内容に従うように指示する-Lフラグを使用rsyncします。

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space

シンボリックリンクが間違った命名や不必要に複雑な階層の面倒を回避する場合があるという考えが好きです。
スリダールサルノバト


-1

この方法を試してください:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.