あるサーバーから別のサーバーに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
試す
rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space [email protected]:/mnt/xlses/split/v2/
末尾のスラッシュを外した/
ソースディレクトリパスから。これにより、rsync
がディレクトリとそのすべてのコンテンツをコピーします。つまり、rsync
は、代わりにリモートホスト(正しい名前)で名前を正しく取得することを心配します。
試す
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によってリモートホスト上で展開されます。 [...]
これはbashで機能します。スペースをバックスラッシュでエスケープしてから引用符を使用します。
rsync -avuz [email protected]:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .
または、変数$ remote_pathにパスがある場合、スペースを置換してエスケープできます。
rsync -avuz [email protected]:"${remote_path// /\\ }" .
すべてのバックスラッシュを気にする必要はありません。二重引用符内に単一引用符を使用してください:
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'" .
)
これは古い質問だと理解していますが、既存の知識体系に追加したいと思いました。
私はスペースのある複数のフォルダでrsync
を使用しましたが、これは機能します。次のように1〜10の番号が付いたフォルダーがあります。
The\ Folder1
The\ Folder2
The\ Folder3
The\ Folder10
rsync
を使用する2つのインスタンスはローカルとリモートです。
Local-引用符がないことに注意してください。
rsync -avu /media/data/The\ Folder* .
Remote-引用符の存在に注意してください
rsync -avu -e ssh [email protected]:"/media/data/The\ Folder*" .
一般的に言えば、引数を引用符で囲み、引数のスペース文字をエスケープします。あなたが与えた例では、試してみてください:
rsync --size-only -avzPe ssh "/mnt/xlses/split/v2/name\ with\ space/" "[email protected]:/mnt/xlses/split/v2/name\ with\ space"
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
状況に応じて、リモートシステムにシンボリックリンクを作成するのが簡単なオプションです。
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
他の誰かがそれを説明するより良い仕事をするかもしれませんが、まあ私はこの質問に自分で答えます。
宛先マシンの設定は引数の解析方法に影響することは明らかであり、引用符やスラッシュを使用してスペースをエスケープすることが困難な設定が必要ですが、ワイルドカードを使用できるため、これを行いました
rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space/ [email protected]:/mnt/xlses/split/v2/name*
nameで始まるディレクトリが1つしかないため、これは私にとっては機能します。複数のディレクトリがある場合、これは機能しません。
最終的に、リモートサーバーがパス名をより効率的に解析できるようにリモートサーバーをセットアップする方法を理解する必要があります。ディレクトリ名にスペースを使用することはありませんが、これをセットアップした人が使用し、少なくとも今のところ行き詰まっています。
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space
ダブルエスケープも動作します