web-dev-qa-db-ja.com

ディレクトリ名にスペースが含まれている場合にSSHを介してrsyncする方法

あるサーバーから別のサーバーに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/ [email protected]:/mnt/xlses/split/v2/"name with space"

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

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

mnt/xlses/split/v2/name

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

彼らがいることを期待していた

mnt/xlses/split/v2/name with space
81
PyNEwbie

試す

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space [email protected]:/mnt/xlses/split/v2/

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

8
dg99

試す

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "[email protected]:/mnt/xlses/split/v2/name with space"

man rsyncから:

-s、-protect-args

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

146
johnLate

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

rsync -avuz [email protected]:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

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

rsync -avuz [email protected]:"${remote_path// /\\ }" .
42
teekarna

2組の引用符を使用する

すべてのバックスラッシュを気にする必要はありません。二重引用符内に単一引用符を使用してください

ssh [email protected]:"'/home/me/test file'" .

逆も使用できます。つまり、一重引用符内の二重引用符

ssh [email protected]:'"/home/me/test file"' .

詳細情報

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

*をクライアントではなくサーバーで解釈する場合は、*を2組の引用符の1つだけに含める必要があります。論理的に外側の引用符のペアはクライアントの解釈をエスケープし、内側の引用符のペアはサーバーの解釈をエスケープするため、これは直観に反しています。

引数を保護

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

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

または

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

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

Username @ Host:file部分全体を引用符のペアの1つで囲むことができます(例:ssh "[email protected]:'/home/me/test file'" .

19

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

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

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

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

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

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

    rsync -avu -e ssh [email protected]:"/media/data/The\ Folder*" .
    
6

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

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "[email protected]:/mnt/xlses/split/v2/name\ with\ space"
3
James

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
1
Shammel Lee

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

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
0
Chris Laskey

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

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

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ [email protected]:/mnt/xlses/split/v2/name*

nameで始まるディレクトリが1つしかないため、これは私にとっては機能します。複数のディレクトリがある場合、これは機能しません。

最終的に、リモートサーバーがパス名をより効率的に解析できるようにリモートサーバーをセットアップする方法を理解する必要があります。ディレクトリ名にスペースを使用することはありませんが、これをセットアップした人が使用し、少なくとも今のところ行き詰まっています。

0
PyNEwbie
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space

ダブルエスケープも動作します

0
Andrej Surkov