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

ディレクトリ名にスペースがある場合にSSHを介して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

答え1

努力する

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

man rsync(2023年アップデート)から:

--secluded-args-s

このオプションは、プロトコルを介して(リモートシェルコマンドラインの代わりに)すべてのファイル名とほとんどのオプションをリモートrsyncに送信し、リモートシェルがそれを変更するのを防ぎます。ワイルドカードは、シェルではなくリモートホストでrsyncによって拡張されます。

[...]

--protect-argsこのオプションは(3.2.6より前)呼び出され、まだ古い名前を使用できます(指定するのは-s常に最も簡単で互換性の高いオプションです)。

答え2

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

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

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

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

答え3

2組の引用符を使用してください。

  1. すべてのバックスラッシュを無視して使用してください。二重引用符内の一重引用符:

    ssh [email protected]:"'/home/me/test file'" .
    
  2. (推奨)は逆に使用することもできます。一重引用符の中に二重引用符があります。:

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

2番目の方法は、サーバーでワイルドカードを使用できるため、これをお勧めします(単一引用符はクライアントでは拡張されないため)。同じプレフィックスを持つ複数のファイルの再同期中にこれを行っています。


追加情報

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

*クライアント以外のサーバーでaを解釈するには、2つのペアの引用符の*うちの1つのみを表示する必要があります。論理的に、外側のペアの引用符はクライアントの解釈から外れ、内側のペアはサーバーの解釈から外れているため、これが直観にずれると思います。

保護パラメータ

それに比べて利点は--protect-args解決策つまり、実際にはこの制限は--protect-argsありません。~または、などの特殊文字を使用できます。$。したがって、次のように書くことができます。

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

または

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

後者の例では、チルダ(~)は次のようになります。外部二重引用符。

username@host:file 部分全体に引用符のペアを入れることができます (例:)ssh "[email protected]:'/home/me/test file'" .

答え4

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

空白のある複数のフォルダを使用しましたが、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 [email protected]:"/media/data/The\ Folder*" .
    

関連情報