2013-08-28 5 views
26

私はrsyncのようなプログラムを探しています。このプログラムは、リモート側に欠けている親ディレクトリを作成します。例えばrsync - 見つからないすべての親ディレクトリを作成しますか?

私は1台のサーバー上/top/a/b/c/dを持っているだけ/top/aは、リモートサーバー上に存在している場合、私は、リモートサーバーへのdをコピーしても作成bcディレクトリを持っていると思います。

コマンド:/tmp/a/bは、リモートサーバー上に存在しないため、

rsync /top/a/b/c/d remote:/top/a/b/c 

は動作しません。そして、それが存在していた場合、ファイルdはパス/top/a/b/cにコピーされます。

これは--include--excludeスイッチを使用してrsyncで行うことが可能ですが、それは例えば、非常に複雑です。:

rsync -v -r a dest:dir \ 
    --include 'a/b'  \ 
    --include 'a/b/c'  \ 
    --include 'a/b/c/d' \ 
    --include 'a/b/c/d/e' \ 
    --exclude 'a/*'  \ 
    --exclude 'a/b/*'  \ 
    --exclude 'a/b/c/*' \ 
    --exclude 'a/b/c/d/*' 

は中間ディレクトリにファイルを持っている場合でも、dest:dir/a/b/c/d/ea/b/c/d/eをのみコピーされます。 (注:包含は除外の前に必要です)

他のオプションはありますか?

+0

[rsync:サーバーでターゲットディレクトリを作成するにはどうすれば設定できますか?](http://stackoverflow.com/questions/1636889/rsync-how-can-i-configure-it-to-create-ターゲットディレクトリ上のサーバ) – mivk

+0

[rsyncに宛先フォルダを強制的に作成する方法](https://stackoverflow.com/questions/9242135/how-to-force-rsync-to-create-destination-folder ) – user

答えて

4

私はあなたが手動で存在を強制することを示唆している:

ssh [email protected] mkdir -p /top/a/b/c 
rsync /top/a/b/c/d remote:/top/a/b/c 

それがすでに存在していない場合、これはターゲットフォルダを作成します。

あなたが例えば

rsync -aR 

を探している可能性があり

+2

はい、それはそれを行う方法です。しかし、私のユースケースは、そのためのコマンドやrsyncへのオプションが必要な便利なシナリオのようです。 – ErikR

+1

私はそのようなフラグを認識していません。 – mnagel

13

rsync -a --relative /top/a/b/c/d remote:/ 

other questionにこのトリックも参照してください。

+2

なぜ '-a'もインクルードするのですか?私はそれが必要ではないと確信しています。 –

+1

@KennyEvitt '-a'は再帰(' -r')ではなく相対( '-R')ではないので、所有者/パーマ(' -aR')を保存するために '-a'が必要なことがあります。この動作を確認するには、rsyncをroot(または別のユーザ)として実行してテストすることができます。 – dhaupin

+1

'--relative'は、質問のようにリモート側のディレクトリコンポーネントが見つからない_create_しません。 – juzzlin

1

--relative私は別の設定をしていたので私のためには機能しません。 はたぶん私がどれだけ--relative作品理解していなかったが、私は

ssh remote mkdir -p /top/a/b/c 
rsync /top/a/b/c/d remote:/top/a/b/c 

が理解しやすいと仕事をしていることが分かりました。

+0

'--relative'はこれとは関係ないので、あなたのためには機能しませんでした:) – juzzlin

+0

@juzzlinたぶん、私はちょうどどのように - 相対的な作品を理解していません。 ;) – andrej

1

私はより良い解決策を探していましたが、手作業でサブディレクトリを作成するにはあまりにも多くのサブディレクトリがあると、私の方が適しているようです。

は単にあなたのための構造を作成します--parentsオプション

cp --parents /your/path/sub/dir/ /tmp/localcopy 
rsync [options] /tmp/localcopy/* remote:/destination/path/ 

cp --parentsとの中間ステップとしてcpを使用しています。

関連する問題