rsync:サーバーにターゲットディレクトリを作成するように構成するにはどうすればよいですか?


143

rsyncローカルコンピュータからサーバーに移行したいのですが。存在しないrsyncディレクトリで、サーバー上に最初にそのディレクトリを作成したい。

どうやってやるの?

回答:


161

作成する最後のリーフディレクトリよりも多くある場合は、ssh ... mkdir -p最初に別のディレクトリを実行するか、ここで説明する--rsync-pathトリックを使用できます

rsync -a --rsync-path="mkdir -p /tmp/x/y/z/ && rsync" $source user@remote:/tmp/x/y/z/

または--relative、Tonyの提案に従ってオプションを使用します。その場合、作成するソースのディレクトリ構造ではなく、存在する必要がある宛先のルートのみを指定します。

rsync -a --relative /new/x/y/z/ user@remote:/pre_existing/dir/

このようにして、/ pre_existing / dir / new / x / y / z /になります。

また、「y / z /」を作成したいが「new / x /」内に作成し./たくない場合は--relative、開始する場所を追加できます。

rsync -a --relative /new/x/./y/z/ user@remote:/pre_existing/dir/

/ pre_existing / dir / y / z /を作成します。


2
アクセスしているサーバーにはがないmkdirため、ハックを使用し--rsync-path="echo f > /public/.keep && rsync /public/.keep /public/newfolder/ && rsync" \ています。追加のファイルが作成されますが、後で削除できます。
Fabiano Soriani、2015年

1
これは新しいrsyncプロトコルでは機能していないようです。&&または;を使用すると、次のようなエラーが表示されます。--rsync-path in scpコマンドの無効な文字!ここ:&& / usr / bin / rsync
ghitesh

@ghiteshエスケープしようとしました&&か?
フェリペアルバレス

@FelipeAlvarezええ、私はやりましたが、うまくいきませんでした。現在、リンクを見つけることができませんが、悪用される可能性があった(そして実際に使用された)と考えられるため、一部のドキュメントではこれは修正されていると述べています。
ghitesh

ありがとう、これでうまくいきます。私の場合、私はリモートサーバーでローカルbashスクリプトを実行し、その中で実行中のssh mkdirコマンドを実行していましたが、rsyncコマンドを実行する前に残りのスクリプトを強制終了しました。これにより、残りのスクリプトを問題なく実行できます。
johndavid400 2017

33

rsyncを接続するためにsshを使用していると仮定すると、前にsshコマンドを送信することはどうでしょうか。

ssh user@server mkdir -p existingdir/newdir

すでに存在する場合は、何も起こりません


4
ufkのリクエストは、「rsyncがサーバー上に[見つからないターゲット]ディレクトリを作成する[&&ファイルをコピーする]」という構文を要求するものです。あなたの応答は、サーバー上に欠落しているターゲットディレクトリを作成するという点で有効ですがrsync、ではなく、したがって応答がありません。
TomRoche、2015

sshサポートされておらず、リモートエンドのにrsync接続している場合、これはオプションではありませんrsync daemon
KrzysztofJabłoński18年

19

-R, --relativeオプションでは、これを行います。

たとえば/var/named/chroot、リモートサーバーで同じディレクトリ構造をバックアップして作成する場合-Rは、それだけを行います。


12
/./ソースパスでを使用して作成するパスの一部のみを指定することもできます。詳細については、manページを参照してください。
Marki555

20
なぜ賛成ですか?答えは間違っrsyncています。ターゲットフォルダが存在しない場合、ディレクトリは自動的に作成されません。はぁ。
zeekvfu 2013年

3
のマンページをチェックすることを強くお勧めし--relativeます。それはあなたが思うことをしないかもしれません。
FiloSottile 14

3
--relativeは、サーバーではなく提供するエンドポイントに、ファイルではなく絶対パスを貼り付けます。通常、/ tmp / foo / bar / file.cをremote:/ tmpにすると、remote:/tmp/file.cが生成されますが、-Rを指定すると/tmp/foo/bar/file.cが作成されます。あなたが何をしているのかを知っていると、本当に厄介なディレクトリ構造になります。
Cormac Mulhall 14年

7
@ Marki555のコメントが成功の鍵です。--relativeと組み合わせて/./、ほとんどの初心者が探しているものです。rsync -avz -e ssh --progress --relative ~/./Desktop/ TARGET_IP:~/デスクトップのコンテンツをターゲットデスクトップにコピーします。ユーザー名の違いがこれにどのように影響するかわかりません。
ダニエルF

15

これは私のために働きました:

 rsync /dev/null node:existing-dir/new-dir/

私はこのメッセージを受け取ります:

skipping non-regular file "null"

しかし、空のディレクトリがぶらつくことを心配する必要はありません。


答えkdubsをありがとう。それはうまくいきました。したがって、同期しているファイルをソースとしてポイントしているフォルダー内に保持したい場合は、それを指定するだけで作成されます。例:rsync -avph / mytest / / otherfolder / mytest /次に、「created directory / otherfolder / mytest」という出力が表示されます
mbrinson

1
new-dirの最後にスラッシュ( '/')があることを忘れないでください。スラッシュがないと、非ディレクトリファイルが作成されます。
tartaruga_casco_mole

4

私はあなたが1つのrsyncコマンドでそれを行うことができるとは思いませんが、最初に次のように追加のディレクトリを「事前作成」することができます:

rsync --recursive emptydir/ destination/newdir

ここで、 'emptydir'はローカルの空のディレクトリです(最初に一時ディレクトリとして作成する必要がある場合があります)。

それは少しハックですが、私にとってはうまくいきます。

乾杯

クリス


一時フォルダを使用する必要はありません。rsync /dev/null node:existing-dir/new-dir/上記の提案を参照してください。
lucid_dreamer 2018年

3

この回答では他の回答を少し使用していますが、状況についてはもう少し明確になることを願っています。rsyncする対象を指定したことがない-単一のディレクトリエントリまたは複数のファイル。

したがって、ソースディレクトリエントリを移動するだけでなく、そこに含まれるファイルを移動するだけだとします。

ローカルに呼び出されるdata/myappdata/ディレクトリがあり、その下に多数のサブディレクトリがあるとします。あなたはdata/あなたのターゲットマシンを持っていますが、いませんdata/myappdata/-これは十分簡単です:

rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata

リモートディレクトリに別の名前を使用することもできます。

rsync -rvv --recursive /path/to/data/myappdata user@host:/remote/path/to/data/newdirname

一部のファイルを移動し、それらを含むディレクトリエントリを移動しない場合は、次のようにします。

rsync -rvv /path/to/data/myappdata/*.txt user@host:/remote/path/to/data/myappdata/

myappdataリモートマシン上にファイルを配置するディレクトリが作成されます。この場合も、data/ディレクトリはリモートマシン上に存在している必要があります。

ちなみに、私の-rvvフラグの使用は、二重に冗長な出力を取得するためのものであり、そのため、必要な再帰的な動作だけでなく、その動作も明確です。

rsync(Ubuntu 12.04の3.0.9)を使用したときに得られるものを示すためだけに

$ rsync -rvv *.txt user@remote.machine:/tmp/newdir/
opening connection using: ssh -l user remote.machine rsync --server -vvre.iLsf . /tmp/newdir/
user@remote.machine's password:
sending incremental file list
created directory /tmp/newdir
delta-transmission enabled
bar.txt
foo.txt
total: matches=0  hash_hits=0  false_alarms=0 data=0

これで少しはうまくいくといいのですが。


これは期待どおりに機能しません。最初のコマンドを試しrsync -rvv /path/to/data/myappdata user@host:/remote/path/to/data/myappdataましたが、ターゲットで作成されたのは/ remote / path / to / data / myappdata / myappdata /です
。– harleygolfguy

私はあなたの最初のコマンドへのわずかな変更を加えると、ソースパスの後にスラッシュ「/」を追加した場合、それは動作します...そうのように: rsync -rvv /path/to/data/myappdata/ user@host:/remote/path/to/data/myappdata
harleygolfguy

2

例えば:

から:/xxx/a/b/c/d/e/1.html

宛先:user @ remote:/pre_existing/dir/b/c/d/e/1.html

rsync:

cd / xxx / a / && rsync -auvR b / c / d / e / user @ remote:/ pre_existing / dir /

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.